2016-06-06 1 views
0

Ich versuche herauszufinden, wie man herausfinden kann, wie man eine Reihe von Workstations innerhalb bestimmter Abteilungen, die keine bestimmten Anwendungen haben, am besten abfragen kann. Eine Workstation kann nicht einmal eine der Problemanwendungen haben, um die Liste zu erstellen. Wenn es eine der Problemanwendungen hat, muss ich es vollständig weglassen.Der beste Weg, um alle Ergebnisse auszuschließen, wenn ein Teil der Teilmenge?

Für den Satz von Daten wären die Ausgabe-Anwendungen 111, 555 und 888, also sollte nur Mach 2 ausgewählt werden. Mach 1 und 3 sollten weggelassen werden. Die Abfrage muss IN verwenden oder in der Lage sein, eine Reihe von Anwendungen abzufragen.

Was ist der schnellste Weg, dies abzufragen?

Mach_name App_id 
mach 1  111 
mach 1  222 
mach 1  333 
mach 2  333 
mach 2  222 
mach 3  111 
mach 3  333 


select distinct mach_name from tablename 
where app_id not IN('111', '555', '888') 

Danke für Ihre Hilfe.

+0

Ich würde denken, 'nicht existiert', oder mit einer linken Verknüpfung, wo nicht existiert, wäre die schnellste. – xQbert

Antwort

1

Wahrscheinlich am schnellsten (aber das Volumen der Daten und Indizes wäre wichtig) Wenn app_ID indiziert ist und A.Mach_name indiziert ist, kann ich nicht sehen, wie dies verbessert werden könnte. Es kann einen Kurzschluss verursachen, sobald eine einzelne Übereinstimmung gefunden wurde.

Select A.mach_name 
from tableName A 
where not exists (Select 1 from tableName B where A.Mach_name = B.Mach_name 
and B.App_ID in ('111','555','888') 
Group By A.Mach_name) 

Wahrscheinliche nächstschnellste muss jedes Mal eine vollständige Übereinstimmung erzeugen; aber immer noch schneller als notieren.

Select A.mach_name 
from tableName A 
LEFT JOIn tableName B 
on A.Mach_name = b.Mach_name 
and B.App_ID in ('111','555','888') 
where B.Mach_name is null 
Group by A.Mach_name 
+0

Es funktioniert, danke – spas2k

Verwandte Themen