什么sql语句会给我这个结果?

时间:2017-08-29 01:48:51

标签: sql-server

我不知道如何恰当地说出我的问题。我为此道歉。我有一张这样的桌子:

EventId | Item | Type
--------+------+------
  1     | 123  |  A
  2     | 123  |  B
  3     | 123  |  C
  4     | 456  |  A
  5     | 456  |  B

我想只选择那些没有C类事件的项目。然后只显示那些项目的B类事件。所以,结果应如下所示:

EventId | Item | Type
--------+------+-------
   5    | 456  |  B

2 个答案:

答案 0 :(得分:1)

这应该可以解决问题......

IF OBJECT_ID('tempdb..#Event', 'U') IS NOT NULL 
DROP TABLE #Event;

CREATE TABLE #Event (
    EventId INT NOT NULL PRIMARY KEY,
    Item INT NOT NULL,
    ItemType CHAR(1) NOT NULL 
    );
INSERT #Event (EventId, Item, ItemType) VALUES
    (1, 123, 'A'),
    (2, 123, 'B'),
    (3, 123, 'C'),
    (4, 456, 'A'),
    (5, 456, 'B');

--=======================================

SELECT 
    e1.EventId, e1.Item, e1.ItemType
FROM
    #Event e1
WHERE
    e1.ItemType = 'B'
    AND NOT EXISTS (
                    SELECT 1
                    FROM #Event e2
                    WHERE 
                        e1.Item = e2.Item
                        AND e2.ItemType = 'C'
                    );

结果...

EventId     Item        ItemType
----------- ----------- --------
5           456         B

答案 1 :(得分:0)

你根据所述约束来回答

SELECT 
    e1.EventId, e1.Item, e1.ItemType
FROM
    Event e1
INNER JOIN Event e2 ON e1.Item != e2.Item
WHERE   e1.ItemType = 'B'
    AND e2.ItemType = 'C'

输出:

enter image description here

注意:与SELECT

相比,内部INNER JOIN查询在处理大量记录时可能会导致性能问题