作者grence (多想两分钟 = =")
看板Database
标题Re: [SQL ] 如何在同一table中找出相同的资料
时间Fri Oct 17 00:34:40 2008
※ 引述《cytogenous (有希望? 希望有!)》之铭言:
: 请问大家, 若我现有一table的schema如下
: Books(Library_name: string, ISBN: string, Book_name: string)
: (无PRIMARY KEY 的限制)
这很怪,这状况以 L_NAME、ISBN两个栏位当 KEY应该不会有重复的问题吧?
真凑不出来最好也编个流水号,
PRIMARY KEY并不只是限制,
有栏位能够唯一识别每列资料,後续操作会容易很多,
甚至可以提示如何兜 SQL语法。
: 而我想找出这其中每个图书馆都有的书, 且回传每间图书馆的本数
: L_NAME ISBN B_NAME BOOKCOUNT
: ------------- -------------------- ---------------- -----------
: LIBRARY A 0-12345-678-3 DM BOOK 1
: LIBRARY A 0-12345-678-9 DB BOOK 2
: LIBRARY B 0-12345-678-3 DB BOOK 2
: LIBRARY B 1-12345-678-6 DM BOOK 1
假设你要的结果是这样:
LIBRARY A 0-12345-678-3 DM BOOK 1
LIBRARY B 0-12345-678-3 DB BOOK 2
STEP 1.找出每间图书馆都有的书
SELECT ISBN, COUNT(L_NAME)
FROM BOOKS
GROUP BY ISBN
HAVING COUNT(L_NAME)>1
…写到这里突然了解你的schema为什麽这样开了XD
每本书都是一笔资料吗?图书馆,应该会有个唯一的条码,
如果是完全一样的资料,可以考虑直接加个「数量」的栏位
好,如果是 SQL SERVER要抓出每间图书馆都有的书可以这样写
SELECT ISBN, COUNT(DISTINCT L_NAME)
FROM BOOKS
GROUP BY ISBN
HAVING COUNT(DISTINCT L_NAME)>1
很明显,并不是每间…因为我不知道总共有几个不同的图书馆,
只要有重复的藏书都抓出来
STEP 2.以 ISBN来找资料
SELECT *
FROM BOOKS
WHERE ISBN IN (
SELECT ISBN
FROM BOOKS
GROUP BY ISBN
HAVING COUNT(DISTINCT L_NAME)>1
)
↑说了是在 SQL SERVER「应该」可以跑
收工…?
再重看一遍发现上面的资料是你下面这段 SQL捞出来的东西?
不懂为什麽会找出 1-12345-678-6、0-12345-678-9
我觉得直接提供原始资料贮存的例子会比较好想像…
: 我本来的写法:
: SELECT LIB1.L_NAME, LIB1.ISBN, LIB1.B_NAME, COUNT (*) BOOKCOUNT
: FROM BOOKS LIB1
: WHERE LIB1.L_NAME = 'A'
: GROUP BY LIB1.L_NAME, LIB1.ISBN, LIB1.B_NAME
: HAVING EXISTS (
: SELECT LIB2.L_NAME, LIB2.ISBN, LIB2.B_NAME, COUNT (*)
: FROM BOOKS LIB2
: WHERE LIB2.L_NAME = 'B'
: GROUP BY LIB2.L_NAME, LIB2.ISBN, LIB2.B_NAME
: HAVING LIB1.ISBN = LIB2.ISBN AND LIB1.B_NAME = LIB2.B_NAME );
HAVING看起来很怪…用 WHERE应该就可以了
剪剪贴贴 1
SELECT LIB1.L_NAME, LIB1.ISBN, LIB1.B_NAME, COUNT (*) BOOKCOUNT
FROM BOOKS LIB1
WHERE LIB1.L_NAME = 'A' AND EXISTS (
SELECT 1
FROM BOOKS LIB2
WHERE LIB2.L_NAME = 'B'--可以考虑去掉这个条件,比对 A跟全部其他
AND LIB1.ISBN = LIB2.ISBN AND LIB1.B_NAME = LIB2.B_NAME )
GROUP BY LIB1.L_NAME, LIB1.ISBN, LIB1.B_NAME
剪剪贴贴 2
SELECT LIB1.L_NAME, LIB1.ISBN, LIB1.B_NAME, COUNT (*) BOOKCOUNT
FROM BOOKS LIB1
JOIN BOOKS LIB2 ON LIB1.ISBN = LIB2.ISBN AND LIB1.B_NAME = LIB2.B_NAME
WHERE LIB1.L_NAME = 'A'
GROUP BY LIB1.L_NAME, LIB1.ISBN, LIB1.B_NAME
回传结果 大概 一样吧..XD
: 但这样只能回传LIBRARY A的书及数量而已,
: 请问有更好的SQL语法吗? 谢谢!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.229.209.141
1F:推 tactical:有看有学知识^^~ 10/17 08:33