2015-06-23 5 views
5

Ich muss Einträge in meiner SQL-Tabelle finden, die immer und nur in einem bestimmten Wert erscheinen.Wie erhalten Sie Einträge von SQL, die nur in bestimmten Werten angezeigt werden?

Zum Beispiel:

DeviceID Transmission 
-------- ------------ 
000329  Inventory 
000980  Inventory 
004406  Starting 
000980  Stopping 
000329  Inventory 
004406  Inventory 

Jetzt muss ich alle DeviceIDs finden, die nur Bestandsübertragung und nie Starten und Anhalten haben. In diesem Fall 000329.

+0

zeigen Sie, was Sie versucht haben –

+0

nicht starten oder stoppen ......... OR ...... = Getriebe .... welche? Theres ein Unterschied – Matt

+0

Sie haben keinen Primärschlüssel. Das ist (potentiell) problematisch !! – Strawberry

Antwort

2

Sie können alle Transmission = 'Inventory' IDs auswählen und auszufiltern diejenigen existieren in Transmission in('Starting', 'Stopping'):

select distinct(DeviceID) from YourTable 
WHERE Transmission = 'Inventory' 
and DeviceID not in 
(select distinct(DeviceID) from YourTable 
    WHERE Transmission in('Starting', 'Stopping') 
); 

SQL Fiddle: http://sqlfiddle.com/#!9/81896/12

+0

Ihre Antwort ist der von [jarlh] (http://stackoverflow.com/a/30997944/4436237) – ughai

+0

@ughai sehr ähnlich Antwort Der größte Unterschied ist, dass ich 'distinct' verwende, um Doppelarbeit zu vermeiden. Jarlhs Antwort verwendet 't1.DeviceID = t2.DeviceID' innerhalb seiner 'not exists'-Klausel, meine dagegen nicht. – coderz

+0

Getestet und funktioniert auch für mich! Danke – tom

0

Es ist ziemlich einfach:

-- You didn't give a name for your table 
SELECT DeviceID from YourTable WHERE Transmission = 'Inventory' 
+3

Sie haben den Teil "Nie Starten oder Stoppen" vergessen. – jarlh

+1

@jarlh Aber wenn es "Inventar" ist, kann es keine andere Sache sein (Starten oder Stoppen) inklusive – sblandin

+0

@jarlh Entschuldigung, ich habe IDs nicht gelesen ;-) – sblandin

0

Je nachdem, was Sie wollen (und wenn Sie mehr Transmission Werte)

SELECT DeviceID, Transmission 
FROM yourtable 
WHERE Transmission NOT IN ('Starting', 'Stopping') 

Oder

SELECT DeviceID, Transmission 
FROM yourtable 
WHERE Transmission = 'Inventory' 
7

Sie kann NOT EXISTS verwenden, um DeviceIDs auszuschließen, die auch Start oder Stopp haben.

select DeviceID 
from tablename t1 
where not exists (select 1 from tablename t2 
        where t1.DeviceID = t2.DeviceID 
        and t2.Transmission in ('Starting','Stopping')) 
    and t1.Transmission = 'Inventory' 
+2

funktioniert korrekt für op http://sqlfiddle.com/ #! 9/81896/9 SQLFIDDLE für die gleiche –

+0

Ihre Antwort ist richtig, aber 'Gruppe von' mit bedingten 'Haben' wäre schneller. – ughai

+0

Auch wenn sowohl DeviceID als auch Transmission indiziert sind? – jarlh

1

asuming Sie haben nur diese drei Staaten mit diesen Namen ('Inventar', 'Starten', 'Stoppen'), die Sie verwenden können:

select deviceID from table1 
group by deviceID 
having max(transmission)='Inventory' 

Mit max hier gilt weil 'Starten', 'Stoppen' sind alphabetisch nach 'Inventory' geordnet.

http://sqlfiddle.com/#!9/81896/8

Das Ergebnis ist die richtige 000.329.

+0

Hmm, witzig, aber begrenzt. Und möglicherweise katastrophal! – Strawberry

+0

Leider funktionierte das nicht für mich, wahrscheinlich, weil ich mehr Einträge für die Übertragung habe, die in alphabetischer Reihenfolge vor Inventory stehen? – tom

+0

@strawberry:;) Sie haben Recht, aber die Frage war in Bezug auf Übertragungsnamen begrenzt. – wumpz

3

können Sie GROUP BY verwenden mit HAVING wie diese

Abfrage

SELECT DeviceID 
FROM DevicesTable 
GROUP BY DeviceID 
HAVING SUM(CASE WHEN Transmission = 'Inventory' THEN 1 ELSE 0 END) > 1 
AND SUM(CASE WHEN Transmission <> 'Inventory' THEN 1 ELSE 0 END) = 0 

SQL Fiddle

OUTPUT

DeviceID 
000329 

Wenn Sie nur gegen Transmission in ('Starting','Stopping') überprüfen möchten, können Sie Transmission IN ('Starting','Stopping') statt Transmission <> 'Inventory' in der zweiten bedingten Aggregation hinzuzufügen.

1

Versuchen Sie dies ...

select * 
from tablename 
where DeviceID not in 
(select DeviceID from tablename 
where Transmission in('Starting','Stopping')) 
and Transmission='Inventory'; 
Verwandte Themen