Ein Ansatz ist eine linke äußere Verknüpfung zu Ihrer Filter-Unterabfrage zu tun, und dann alle Zeilen auswählen, in dem die Verbindung entweder nicht (was bedeutet, dass die Unterabfrage keine Zeilen zurückgegeben werden) oder es gelungen und den richtigen Wert hatte:
SELECT personTbl.*
FROM personTbl
LEFT
OUTER
JOIN (SELECT DISTINCT filterValue
FROM filterTable
WHERE filterType = 'name'
) filter
ON 1 = 1
WHERE filter.filterValue = personTbl.name
OR filter.filterValue IS NULL
;
Um ehrlich zu sein, ich bin nicht sicher, ob die oben eine gute Idee ist — es ist nicht sehr intuitiv , und ich bin nicht sicher, wie gut es — durchführen wird, aber Sie können für sich selbst beurteilen.
1. Als Beweis seiner unintuitiveness, Zeuge der irrt Anspruch unter, dass es nicht funktioniert. Zum Zeitpunkt dieses Schreibens hat dieser Kommentar zwei Upvotes gesammelt. Also, obwohl die Abfrage korrekt ist, inspiriert es eindeutig Menschen zu großer Zuversicht, dass es falsch ist. Das ist ein schöner Partytrick, aber im Produktionscode generell nicht erwünscht.
ich keine besseren Art und Weise denken. Sie können jedoch eine WITH-Klausel verwenden, um die Unterabfrage nur einmal schreiben zu müssen. –
Das ist auch meine Antwort - benutze die WITH-Klausel (Abfrage-Subfactoring), wenn du jemals Änderungen am Unterabfrage-Code vornehmen musst, kannst du sie nur einmal machen (Wartungsfreundlichkeit, nicht nur beim ersten Schreiben). – mathguy