推 tactical:有看有學知識^^~ 10/17 08:33
※ 引述《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