2016-08-03 12 views
2

Nehmen wir einfache Tabelle Nach, die in der Tabelle nicht verfügbar sind

Col1 
====== 
one 
two 

einfache Abfrage Nach Nehmen wir

Select count(*) from TABLE_A where Col1 in ('one','two','three','four') 

In obigen Abfrage produzieren es Ergebnis folgende

2 

Jetzt möchte ich herausfinden, was die Werte in IN-Bedingung sind, die in Tabelle A nicht verfügbar sind.

Wie finden Sie heraus, dass Werte, die nicht in der Tabelle verfügbar sind?

wie unten Ergebnis

three 
four 

Above Abfragen nur Beispiel. In meiner Realtime-Abfrage haben 1000 Werte in IN-Condition.

Arbeits Datenbank: DB2

+0

Wenn die 1000 Werte in 'IN' Zustand dann, Sie hinzufügen Tabelle und speichern Sie alle 1000 Datensätze darin.Dann mit 'LEFT JOIN' mit' NULL' Check können Sie leicht die nicht passenden Datensätze – Arulkumar

+0

@Arulkumar finden. schon wusste ich über diese Methode. Ich brauche eine andere Lösung. –

+0

Könnte eine Syntaxalternative für die Spezifikation der VALUES() als _any other other_ Methode genügen? Wenn das IN-Prädikat als [oder effektiv; Ich kann die Nicht-Auswahl-Unterabfrage-Syntax nicht testen] 'Col1 in (Werte ('Eins'), ('Zwei'), ('Drei'), ('Vier'))' Dann könnte dieselbe Syntax in einem verwendet werden EXCEPT query [oder der ähnliche Effekt von EXCEPTION JOIN zu dem bereits vorgeschlagenen LEFT JOIN]. – CRPence

Antwort

3

Dies ist eine der Arbeit um Ihre Erwartungen zu erreichen.

Anstatt die Werte in der IN Bedingung fest zu codieren, können Sie diese Werte in eine Tabelle verschieben. Wenn Sie einfach LEFT JOIN mit NULL überprüfen, können Sie die nicht übereinstimmenden Werte erhalten.

SELECT MR.Col1 
FROM MatchingRecords MR -- here MatchingRecords table contains the IN condition values 
LEFT JOIN Table_A TA ON TA.Col1 = MR.Col1 
WHERE TA.Col1 IS NULL; 

Working DEMO

-1

Wenn die Werte in der Anweisung String aufgeführt werden, anstatt in einer Tabelle gespeichert, dann vielleicht eine Revision der Syntax für die Werteliste verwendet wird zur Zeit zusammensetzt [ offensichtlich, von einer anderen Eingabe als eine TABLE] für das IN-Prädikat kann bewirkt werden? Die folgende überarbeitete Syntax für eine Werteliste könnte sowohl für die ursprüngliche Aggregatabfrage [die unmittelbar nachfolgend als erste von zwei Abfragen angezeigt wird] als auch für die Abfrage verwendet werden, für die die Wie-zu-Code abgefragt wird [der zweite der zwei Abfragen unten]:

Select count(*) 
from TABLE_A 
where Col1 in (values('one'),('two'),('three'),('four')) 
; -- report from above query follows: 
COUNT (*) 
      2 


[bgn-Edit 05-Aug-2016: Hinzufügen dieser Text und Beispiel knapp unterhalb]
Offenbar mindestens eine DB2-Variante an unbenannte Spalten für die abgeleitete Tabelle sperrt, so dass die Abfrage gerade unten nennt die Spalte; Ich wählte COL1, um den Namen von der tatsächlichen TABLE abzugleichen, aber das sollte nicht notwendig sein. Die (col1) wird zur ursprünglichen Abfrage hinzugefügt, die von der ursprünglichen Vorbearbeitungsversion übrig bleibt. diese Version bleibt nach diesem \ Einfügen bearbeitet und fehlt die (col1) hier hinzugefügt:

select * 
from (values('one'),('two'),('three'),('four')) as x (col1) 
except (select * from table_a) 
; -- report from above query follows: 
COL1 
three 
four 


Das Folgende ist die ursprüngliche Abfrage angegeben, für die der Kommentar unten einen Fehler für eine unbenannte Spalte legt nahe, wenn auf einigen unausgesprochenen DB2 laufen Variante; Ich habe darauf hingewiesen, dass diese SQL-Abfrage-Funktionen ohne Fehler, auf DB2 für i 7.1
[End-Edit 05-Aug-2016]

select * 
from (values('one'),('two'),('three'),('four')) as x 
except (select * from table_a) 
; -- report from above query follows: 
VALUES 
three 
four 
+0

Ihre Abfrage gibt einen Fehler wie "Für Spalte 1 von 'x' wurde kein Spaltenname angegeben." @CRPence –

+0

Was auf der IBM DB2 für i SQL mit IBM i 7.1 ohne Fehler angezeigt wird Die Syntax zum Benennen von Spalten für eine abgeleitete Tabelle ist jedoch eine Klammerliste in Klammern nach dem AS-Bezeichner. Ich werde die Antwort bearbeiten, um das aufzunehmen – CRPence

Verwandte Themen