返回一个列值的结果,但不返回另一个SQL的结果

时间:2014-03-02 19:31:51

标签: mysql sql sql-server

我有以下两张表:

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的itemno。答案应该是520。

2 个答案:

答案 0 :(得分: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-within-sets”查询的方法,因为它非常灵活。如果你想说应该包含事件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;

答案 1 :(得分: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)
相关问题