SQL mehrere Spalten in IN-Klausel
Wenn wir brauchen, um der Abfrage eine Tabelle, basierend auf einem set von Werten für eine bestimmte Spalte, wir können einfach verwenden Sie die IN-Klausel.
Aber wenn die Abfrage ausgeführt werden müssen, die sich aus mehreren Spalten, die wir nicht verwenden konnten, IN der Klausel(grep in SO threads.)
Aus anderen threads können wir umgehen dieses problem mithilfe von Verknüpfungen oder exists-Klausel etc. Aber Sie funktionieren alle, wenn sowohl die Haupt-Tabelle und suchen von Daten in der Datenbank.
E.g
User table:
firstName, lastName, City
Gegeben eine Liste (Vorname, Nachname) - Tupeln, die ich brauche, um die Städte.
Ich denken kann von folgenden Lösungen.
1
Konstrukt einer select-Abfrage wie
SELECT city from user where (firstName=x and lastName=y) or (firstName=a and lastName=b) or .....
2
Laden alle firstName, lastName Werte in eine staging-Tabelle und führen Sie einen join zwischen 'user' - Tabelle und der neuen staging-Tabelle.
Gibt es irgendwelche Möglichkeiten, dieses problem zu lösen, und was ist die bevorzugte Lösung dieses Problems im Allgemeinen?
InformationsquelleAutor der Frage Htaras | 2012-10-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte man dies so tun:
Die sqlfiddle.
InformationsquelleAutor der Antwort xdazz
Es endet oft einfacher zu laden Sie Ihre Daten in die Datenbank, auch wenn es nur für eine kurze Anfrage. Hart-codierte Daten scheint schnell zu geben, aber es wird schnell zu einem Schmerz, wenn Sie beginnen, um änderungen vorzunehmen.
Jedoch, wenn Sie wollen, um code die Namen direkt in die Abfrage ein, hier ist ein sauberer Weg, es zu tun:
Den Vorteil, dass es trennt Ihre Daten aus der Abfrage etwas.
(Dies ist die DB2-syntax; es braucht vielleicht ein bisschen zwicken auf Ihrem system).
InformationsquelleAutor der Antwort dan1111
In Oracle können Sie dies tun:
InformationsquelleAutor der Antwort grokster
Sicherzustellen, dass Sie haben einen index für die Spalten firstname und lastname und gehen mit 1. Das ist wirklich nicht viel einer Auswirkung auf die Leistung an alle.
EDIT: Nach @Dems Kommentar-spamming plan-cache ,eine bessere Lösung sein könnte, um eine berechnete Spalte erstellen, die auf die bestehende Tabelle (oder in einer separaten Ansicht) enthielt eine verkettete Firstname + Lastname-Wert, so dass Sie eine Abfrage ausführen, wie
wo
@fullnames
sieht ein bisschen aus wie"'JonDoe', 'JaneDoe'"
etcInformationsquelleAutor der Antwort Jaimal Chohan
Im Allgemeinen können Sie einfach schreiben Sie die Where-Bedingung so:
Hinweis
Oracle ignoriert Zeilen, in denen eine oder mehrere der ausgewählten Spalten ist NULL. In diesen Fällen werden Sie wahrscheinlich wollen, um von den NVL-Funktion zum anzeigen von NULL ein spezieller Wert (das sollte nicht sein, in der Werte):
oracle sql
InformationsquelleAutor der Antwort Alexander Roskamp
Bestimmen, ob die Liste der Namen ist unterschiedlich bei jeder Abfrage oder wiederverwendet werden. Wenn er wiederverwendet wird, gehört es in die Datenbank.
Selbst wenn es eindeutig ist wird bei jeder Abfrage, kann es nützlich sein, laden Sie es in eine temporäre Tabelle (
#table
syntax) aus performance-Gründen - in diesem Fall werden Sie in der Lage zu vermeiden Neukompilierung einer komplexen Abfrage.Wenn die maximale Anzahl der Namen fest, sollten Sie einen parametrisierten Abfrage.
Jedoch, wenn keiner der genannten Fälle zutrifft, würde ich mit inlining den Namen in der Abfrage als in Ihrem Ansatz #1.
InformationsquelleAutor der Antwort Jirka Hanika