假設我們在SQL數據庫中有一個表(EnsembleMembers),其中包含以下數據。它列出了各種樂團的音樂家以及他們的樂器。涉及類似異或情況的SQL查詢的問題
EnsembleID (FK) MusicianID (FK) Instrument
----------------------------------------------
'1' '1' 'Clarinet'
'1' '4' 'Clarinet'
'1' '100' 'Saxophone'
'2' '200' 'Saxophone'
'2' '300' 'Saxophone'
'2' '320' 'Flute'
'99' '300' 'Clarinet'
我想選擇合奏的ID,其中合奏有一個或一個以上的薩克斯或一個或多個玩家單簧管,但不能同時使用。我已經嘗試了下面的SQL語句,但它返回1,2,2,99
,而不是預期的2,99
。
SELECT e1.EnsembleID
FROM ensemblemembers e1
WHERE e1.Instrument = 'Saxophone'
OR e1.Instrument = 'Clarinet'
AND NOT EXISTS (SELECT *
FROM ensemblemembers e2
WHERE ( e1.Instrument = 'Saxophone'
AND e2.Instrument = 'Clarinet'
AND e1.EnsembleID = e2.EnsembleID)
OR ( e1.Instrument = 'Clarinet'
AND e2.Instrument = 'Saxophone'
AND e1.EnsembleID = e2.EnsembleID));
我在做什麼錯?
PS - 我不想爲了性能原因使用DISTINCT。
沒有使用DISTINCT? – 2010-10-27 02:37:45
在GROUP BY解決方案中,如果在一個合奏中可以有多個薩克斯或多個單簧管,則必須使用DISTINCT。另請參閱我剛剛添加的第二個解決方案,這可能取決於您使用的數據庫品牌。 – 2010-10-27 02:39:52
您確定完整的外部連接示例是正確的嗎?我知道MySQL不支持它們,但我重複了你的例子,將其中一個改爲左外連接,另一個改爲右外連接,並將兩者聯合(這是模仿AFAIK功能的方式),但我仍然檢索同時擁有薩克斯管和單簧管演奏員的合奏編號。 – 2010-10-27 03:24:37