我有两张桌子:
表A :
Item_Number EVENT_ID
表B :
EVENT_ID EVENT_TYPE_ID
EVENT_ID
是唯一的,它们在两个表中是相同的。 EVENT_TYPE_ID
具有与1-100不同的值。但我只对EVENT_TYPE_ID = 40和EVENT_TYPE_ID = 41感兴趣。所以我使用内部联接来挑选那些只有EVENT_TYPE_ID = 40或EVENT_TYPE_ID = 41的项目。
SELECT
ITEM_NUMBER, EVENT_TYPE_ID
FROM
A
INNER JOIN
B ON A.EVENT_ID = B.EVENT_ID
WHERE
EVENT_TYPE_ID = 40 or EVENT_TYPE_ID = 41
我得到了一些这样的结果:
Item_Number Event_Type_ID
-----------------------------
1004 40
1019 41
1002 41
1109 40
1004 41
1004 40
1019 40
1002 41
1109 40
这些项目中,有些只有类型为40的事件,有些只有类型为41的事件,有些事件有40种和41种类型的事件。现在我想要获取那些只有40或41类事件但没有这两个事件的项目。我应该如何编写查询?
答案 0 :(得分:1)
您可以使用左连接技巧:
select A.ITEM_NUMBER, B.EVENT_TYPE_ID
from A
join B on A.EVENT_ID=B.EVENT_ID
and B.EVENT_TYPE_ID IN (40,41)
left join B B2 on A.EVENT_ID=B2.EVENT_ID
and B2.EVENT_TYPE_ID IN (40,41)
and B2.EVENT_TYPE_ID != B.EVENT_TYPE_ID
where B2.EVENT_TYPE_ID is null
这会在其他事件类型上与B进行外部联接,并过滤 out 行,其中包含两种类型。
答案 1 :(得分:0)
我建议使用GROUP BY
和COUNT
更简单的解决方案:
SELECT ITEM_NUMBER, COUNT(ITEM_NUMBER) COUNT_ITEM_NUMBER
from A
INNER Join B ON A.EVENT_ID=B.EVENT_ID
WHERE EVENT_TYPE_ID IN (40, 41)
GROUP BY ITEM_NUMBER
HAVING COUNT(ITEM_NUMBER) = 1;
如果你想知道记录上的EVENT_TYPE_ID,你可以在另一次加入之后进行,例如
SELECT GROUPED.ITEM_NUMBER, B.EVENT_TYPE_ID
FROM (
SELECT ITEM_NUMBER, COUNT(ITEM_NUMBER) COUNT_ITEM_NUMBER
from A
INNER Join B ON A.EVENT_ID=B.EVENT_ID
WHERE EVENT_TYPE_ID (40, 41)
GROUP BY ITEM_NUMBER
HAVING COUNT(ITEM_NUMBER) = 1 ) GROUPED
INNER Join B ON GROUPED.EVENT_ID=B.EVENT_ID
WHERE EVENT_TYPE_ID (40, 41)