我有以下两张表:
我想列出为事件2099选择但不是事件2201的所有项目。我该怎么办?
我有这个:
SELECT ITEMNO, UNIT_PRICE, EST_SERVINGS
FROM MENUITEM
WHERE ITEMNO IN (SELECT ITEMNO FROM SELECTEDITEM WHERE EVENTID = 2099);
但这只返回了事件2099的itemno。答案应该是520。
答案 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)