2017-05-06 76 views
1

我想在SQL中做一些練習,但我有一個很大的問題來了解一些查詢。SQL不存在子查詢

以下是我與工作表:

  • Spectacle(Spectacle_ID,滴度DateDéb,綿延,Salle_ID,Chanteur)
  • Concert(Concert_ID,日期,HEURE,Spectacle_ID)
  • Salle (Salle_ID,喃,住址,Capacité)
  • Billet(Billet_ID,Concert_ID,Num_Place,Catégorie,披)
  • Vente(Vente_ID,Date_Vente,Billet_ID,MoyenPaiement)

的問題是選擇所有chanteur他們在所有salles至少有一場音樂會。

的解決方案是

SELECT Chanteur 
FROM Spectacle t 
WHERE NOT EXISTS (SELECT * 
        FROM Salle u 
        WHERE NOT EXISTS (SELECT * 
            FROM Spectacle v 
            WHERE v.Chanteur = t. Chanteur 
             AND u.Salle_ID = v.Salle_ID) 
       ) 

,但我無法理解這個概念。

請教程或解釋一些幫助 - 感謝

+0

雙重否定。除了那些場地不存在但沒有在那裏的所有表演中表演的人以外,所有人都可以獲得。我想如果你用口頭語言和邏輯來理解,你也可以使用SQL。這不是一個語法問題,更多的是讓你頭腦發熱的問題。 – dlatikay

回答

1

我可以看到爲什麼解決方案可能會造成混亂。返回需要其他行存在的結果迫使我們垂直而不是水平地將問題可視化。希望這會有所幫助。

我們只想返回Chanteur,在SalleSpectacle

另一種說法是返回Chanteur,它不會丟失任何Salle

您所提出的解決方案以更接近問題的第二種形式解決問題。只有在不存在任何Salle的情況下,它纔會返回Chanteur,對於該(不缺少任何Salle),該號碼沒有相應的Spectacle

另一種解決方案是對每個Chanteur使用聚合和count(distinct Salle_ID),並將其與Salle中的總行數進行比較。這似乎更自然,當問題爲已全部而不是不會丟失任何

+1

嗨,謝謝你的回答,這裏是我的建議「從chanteur擁有count(獨特salle_id)> =(從salle選擇count(sale_id)的眼鏡組中選擇chanteur」)這個答案是否正確? –

+0

@maevabell。 。 。我更直觀地查看您的查詢。 –

+0

@maevabell看起來正確,也更簡單。請注意,您可以使用'='而不是'> =' – SqlZim