2014-03-02 64 views
0

我有下面兩個表:返回結果爲一個值,而不是另一個SQL

enter image description here

我想列出已選定事件2099的所有項目,但不是事件2201將如何我這樣做?

我有這樣的:

SELECT ITEMNO, UNIT_PRICE, EST_SERVINGS         
FROM MENUITEM               
WHERE ITEMNO IN (SELECT ITEMNO FROM SELECTEDITEM WHERE EVENTID = 2099); 

但這只是與事件2099年返回貨號的答案應該只是520

+1

'... AND ITEMNO NOT IN(SELECT ITEMNO FROM SELECTEDITEM WHERE EVENTID = 2201)'? –

+1

好的,謝謝!我以爲我已經嘗試過,但它現在正在工作!謝謝。 – tkess17

+0

您使用的是SQL Server還是MySQL?請適當地標記你的問題。 –

回答

0

試試這個:

SELECT ITEMNO, UNIT_PRICE, EST_SERVINGS         
FROM MENUITEM MI        
WHERE 
EXISTS 
    (SELECT 'ON2099' 
    FROM SELECTEDITEM SI 
    WHERE SI.ITEMNO = MI.ITEMNO AND SI.EVENTID = 2099) 
AND NOT EXISTS 
    (SELECT 'ON2201' 
    FROM SELECTEDITEM SI 
    WHERE SI.ITEMNO = MI.ITEMNO AND SI.EVENTID = 2201) 
1

我是一個球迷與having子句一起使用這種類型查詢的聚合。

SELECT mi.ITEMNO, mi.UNIT_PRICE, mi.EST_SERVINGS         
FROM MENUITEM mi JOIN 
    SELECTEDITEM si 
    ON mi.ITEMNO = si.ITEMNO 
GROUP BY mi.ITEMNO, mi.UNIT_PRICE, mi.EST_SERVINGS 
HAVING SUM(CASE WHEN EVENTID = 2099 THEN 1 ELSE 0 END) > 0 AND 
     SUM(CASE WHEN EVENTID = 2201 THEN 1 ELSE 0 END) = 0; 

having子句中每個條件被計數的特定項被用於事件的次數。 > 0表示該物品至少使用過一次。 = 0表示該項目不顯示。所以第一個說該項目用於事件2099,第二個項目不用於2202.

我喜歡這種表達這些「set-set-set」查詢的方法,因爲它非常靈活。如果你想說應該包含事件2101,只需添加另一個子句:

HAVING SUM(CASE WHEN EVENTID = 2099 THEN 1 ELSE 0 END) > 0 AND 
     SUM(CASE WHEN EVENTID = 2101 THEN 1 ELSE 0 END) > 0 AND 
     SUM(CASE WHEN EVENTID = 2201 THEN 1 ELSE 0 END) = 0; 
相關問題