如何从两个表中选择项目,其中一个项目只有一个值

时间:2017-12-01 15:29:15

标签: sql

我有两张桌子:

表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类事件但没有这两个事件的项目。我应该如何编写查询?

2 个答案:

答案 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 BYCOUNT更简单的解决方案:

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)