2017-08-29 92 views
2

我不知道如何正确地说出我的问题。我对此表示歉意。我有一个表是这样的:什么sql语句会给我这个结果?

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 
+0

选择*(SELECT * FROM表,其中类型<> 'C'),其中类型= 'B' – Proxytype

回答

-1

还有更多可读/优雅/优化写这个办法,但一个快速和肮脏的方式找到你的结果集是使用子查询:

SELECT * FROM yourTable 
WHERE Item NOT IN (SELECT Item FROM yourTable WHERE type = 'C') 
    AND type = 'B' 

其他选项包括SQL Server WITH子句而不是子查询,或者自身加入表。所有人都可以完成上述相同的结果。

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 
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

相关问题