2015-06-23 14 views
5

Devo trovare le voci nella mia tabella SQL che appaiono sempre e solo in un determinato valore.Come ottenere voci da SQL che appaiono solo in un certo valore?

Ad esempio:

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

Ora ho bisogno di trovare tutti DeviceIDs che hanno solo inventario Trasmissioni e mai avvio o l'arresto. In questo caso 000329.

+0

mostra cosa hai provato –

+0

NON si avvia o si arresta ......... O ...... = Trasmissioni .... quale? C'è una differenza – Matt

+0

Non hai PRIMARY KEY. Questo è (potenzialmente) problematico !! – Strawberry

risposta

2

È possibile selezionare tutti Transmission = 'Inventory' ids e filtrare quelli esistono 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

la tua risposta è molto simile a quella pubblicata da [jarlh] (http://stackoverflow.com/a/30997944/4436237) – ughai

+0

@ughai La maggior parte delle differenze è che io uso 'distinct' per evitare la duplicazione. la risposta di jarlh usa join 't1.DeviceID = t2.DeviceID' nella sua clausola' not exists', mentre la mia no. – coderz

+0

Testato e funziona anche per me! Grazie – tom

0

E 'piuttosto semplice:

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

Hai dimenticato la parte "never Starting or Stopping". – jarlh

+1

@jarlh Ma se è 'Inventario' non può essere qualsiasi altra cosa (avvio o arresto) incluso – sblandin

+0

@jarlh scusate non ho letto ID ;-) – sblandin

0

A seconda di ciò che si vuole (e se si dispone di più valori Transmission)

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

O

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

È possibile utilizzare NOT EXISTS per escludere DeviceID che hanno anche Avvio o Arresto.

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

funzionante corretto per op http://sqlfiddle.com/ #! 9/81896/9 SQLFIDDLE per lo stesso –

+0

La tua risposta è corretta, tuttavia 'group by' con' avere' condizionale sarebbe più veloce. – ughai

+0

Anche se sia DeviceID sia Transmission sono indicizzati? – jarlh

1

Asuming avete solo questi tre stati con questi nomi ('inventario', 'a partire', 'bloccando') è possibile utilizzare:

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

Utilizzando max qui è valido perché "Inizio", "Arresto" sono ordinati in ordine alfabetico dopo "Inventario".

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

Il risultato è la corretta .

+0

Hmm, spiritoso, ma limitato. E potenzialmente disastroso! – Strawberry

+0

Sfortunatamente questo non ha funzionato per me, probabilmente perché ho più voci di trasmissione che arrivano prima di Inventory in ordine alfabetico? – tom

+0

@strawberry:;) hai ragione, ma la domanda era limitata riguardo i nomi delle trasmissioni. – wumpz

3

È possibile utilizzare GROUP BY con HAVING come questo

Query

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

USCITA

DeviceID 
000329 

Se solo si desidera controllare contro Transmission in ('Starting','Stopping'), è possibile aggiungere Transmission IN ('Starting','Stopping') invece di Transmission <> 'Inventory' nella seconda aggregazione condizionale.

1

Prova questo ...

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