看板 Database 關於我們 聯絡資訊
※ 引述《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
tactical:有看有學知識^^~ 10/17 08:33