2017-05-02 7 views
0

ich sql völlig neu bin, habe ich eine Tabelle wie:Wie Daten aus der Tabelle wählen, basierend auf einer Bedingung auf seiner Säule

enter image description here

SQL verwenden, möchte ich diese Zeilen auszuwählen, die keine haben "INPROGRESS" -Zustand für dieselbe LOCKID. Zum Beispiel, in der obigen Tabelle Abfrage sollte Zeilen mit ID 4, 5, 6 zurückgeben. Danke.

+0

Definieren Sie zwei Datengruppen ... eine mit Inprogress, die nicht in Bearbeitung ist. dann überprüfen Sie, ob ein Satz in den anderen ist ... – xQbert

+0

Bitte lesen Sie http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so -when-ask-a-question/285557 und die akzeptierte Antwort –

+0

Welches DBMS verwenden Sie? Postgres? Orakel? DB2? Feuervogel? –

Antwort

2

Sie können die NOT IN-Anweisung verwenden, um Zeilen auszuschließen, die eine 'INPROGRESS' enthalten. ZB:

SELECT * 
FROM tbl 
WHERE LOCKID NOT IN (SELECT LOCKID 
         FROM tbl 
         WHERE STATE = 'INPROGRESS') 

Sie können auch NICHT VORHANDEN verwenden die gleiche Sache

SELECT * 
FROM tbl t1 
WHERE NOT EXISTS (SELECT * 
        FROM tbl t2 
        WHERE t2.STATE = 'INPROGRESS' 
          AND t1.LOCKID = t2.LOCKID) 

Manchmal eine oder das andere Konstrukt zu tun, wird eine bessere Leistung, aber in den meisten Fällen, in meiner Erfahrung, sie sind so ziemlich gleichwertig.

+1

Die Antwort von @xQbert zeigt, dass Sie auch NOT EXISTS verwenden können, um das Gleiche zu tun. In einigen Fällen kann NOT EXISTS besser funktionieren, aber NOT IN fühlt sich für mich immer intuitiver an. –

+1

Ich könnte David nicht zustimmen. Es hat mich 2-3 Jahre gebraucht, um nicht zu existieren; und ich falle immer zu ihm zurück oder eine linke Verbindung, wo B.val null ist ... Nun, da du 2 haben kannst, kannst du auch die dritte selbst verbinden, wo b nicht null ist! : P – xQbert

0

Return alle Datensätze aus der Tabelle (aliased „A“) in dem Zustand ist, ist das nicht der Lockid vorgesehen InProgress nicht in einer Gruppe von Daten mit einem Zustand der inprogress gefunden.

Dies verwendet ein Konzept einer korrelierten Abfrage binden die innere Abfrage an äußere. Die Auswahl 1 in der Unterabfrage ist weggeworfen (aber da der Compiler eine Auswahl erfordert, um einen Wert zurückzugeben, obwohl wir ihn nicht verwenden), ist uns nur die Übereinstimmung von LOCKID wichtig.

SELECT * 
FROM TABLE A 
WHERE A.STATE <> 'INPROGRESS' 
AND NOT EXISTS (SELECT 1 
       FROM TABLE B 
       WHERE B.STATE = 'INPROGRESS' 
        AND A.LOCKID = B.LOCKID) 
+0

oh man .. funktioniert wie ein Charme .. danke für eine schnelle Antwort. – Usman

Verwandte Themen