2017-01-06 31 views
0

我正在做一些關於自己學習的練習,並且我在子羣中遇到了這個練習 。具有Aggregate和條件語句的SQL語句

http://studybyyourself.com/seminar/sql/exercises/7-1/?lang=en

我聽錯了第一次(我把與作者的名字一個WHERE語句),然後我檢查瞭解決方案,它是

SELECT * 
FROM Author AS a 
INNER JOIN Writing AS w ON w.Author_id = a.ID 
INNER JOIN Book AS b ON b.ID = w.Book_id 
GROUP BY b.ID 
HAVING COUNT(*) = 1 AND a.Last_Name = 'Duncan' AND a.First_name = 'Andrew' 

所以我認爲這是正常的只要將它們與HAVING語句中的聚合進行配對,就使用條件非聚合語句,是否正確?

+0

我刪除了不兼容的數據庫標籤。請標記您真正使用的數據庫。 –

+0

它的工作原理,但我更喜歡'where'子句做所有可能的過濾。我更喜歡'有'做彙總過濾 – zedfoxus

回答

2

我會說搬完JOIN條件在WHERE條款分組可以發生之前應用過濾器並只分組或聚集過濾器HAVING條款,因爲過濾條件HAVING條款適用於總結果,並都是爲了這個目的

WHERE a.Last_Name = 'Duncan' AND a.First_name = 'Andrew' 
GROUP BY b.ID 
HAVING COUNT(*) = 1 
+0

這不會正確回答問題。 –

+1

如果你想學習SQL,那麼這個答案顯然更好 - 這是解決這個問題的正確方法。 「HAVING」子句就像您的聚合的WHERE語句。你想要做的是限制查詢只返回只寫了一本書的Andrew Duncan的行。 這是數據庫設計和查詢邏輯的一個非常可怕的例子。 @Rahul在幫助給你正確的方式來完成這項任務方面做得更好。練習要找的是你理解如何使用'HAVING'子句,但它使用了一個不好的例子。 –

1

去別的地方學習SQL。這句話在句法上和邏輯上都是不正確的。

正確的解決辦法看起來更象這樣:

SELECT . . . 
FROM Author AS a INNER JOIN 
    Writing AS w 
    ON w.Author_id = a.ID INNER JOIN 
    Book AS b 
    ON b.ID = w.Book_id 
GROUP BY b.ID 
HAVING COUNT(*) = 1 AND 
     MAX(a.Last_Name) = 'Duncan' AND 
     MAX(a.First_name) = 'Andrew'; 

列從比b應(正確地說)其他表也有聚合函數。