2017-08-29 2 views
2

Ich weiß nicht, wie ich meine Frage richtig formulieren soll. Ich entschuldige mich dafür. Ich habe eine Tabelle wie folgt aus:Welche SQL-Anweisung wird mir dieses Ergebnis geben?

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

ich nur die Elemente auswählen möchten, die nur Ereignis vom Typ B dieser Gegenstände nicht zeigen, dann Ereignis vom Typ C haben. So sollte das Ergebnis wie folgt aussehen:

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

select * from (select * from table where Typ <> 'C'), wobei type = 'B' – Proxytype

Antwort

-1

Es ist besser lesbar/elegant/optimierte Möglichkeiten, dies zu schreiben, sondern eine schnelle und schmutzige Art und Weise der Ergebnismenge zu finden, ist eine Unterabfrage zu verwenden:

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

Andere Optionen enthalten die SQL Server WITH-Klausel anstelle der Unterabfrage oder die Verknüpfung der Tabelle mit sich selbst. Alle können dieselben Ergebnisse wie oben erzielen.

1

Dieser den Trick tun sollten ...

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' 
        ); 

Ergebnisse ...

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

Sie auf Basis beantworten sagte

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' 

Ausgabe einschränken:

enter image description here

Hinweis: Inner SELECT Abfrage kann das Leistungsproblem verursachen, während Vergleich Verarbeitung von großen Anzahl von Datensätzen INNER JOIN