Angesichts der Beispieldaten:
CREATE TABLE dbo.Data
(
ID integer PRIMARY KEY,
A0 character(1) NULL,
A1 character(1) NULL,
A2 character(1) NULL,
A3 character(1) NULL,
A4 character(1) NULL
);
INSERT dbo.Data
(ID, A0, A1, A2, A3, A4)
VALUES
(14, 'A', 'B', 'A', 'C', 'A'),
(15, 'A', 'A', 'A', 'A', 'A');
Eine alternative Möglichkeit, alle Nicht-ID-Spalten auf Gleichheit zu vergleichen, ist:
SELECT
D.*
FROM dbo.Data AS D
WHERE EXISTS
(
-- All columns except the last one
SELECT D.A0, D.A1, D.A2, D.A3
INTERSECT
-- All columns except the first one
SELECT D.A1, D.A2, D.A3, D.A4
);
Wenn viele Spalten vorhanden sind, ist dies möglicherweise einfacher zu schreiben als eine Abfrage mit mehreren AND
Klauseln (und häufig kompakter). In Management Studio können Sie den Knoten Spalten aus dem Objekt-Explorer in ein Textfenster ziehen, um eine durch Kommas getrennte Spaltenliste zu erstellen. Das Versetzen dieser Liste für den zweiten Teil von INTERSECT
ist ebenfalls trivial.
Der durch diese Abfrage generierte Ausführungsplan ist genauso effizient wie die AND
Version mit mehreren Klauseln. Semantisch unterscheidet es sich geringfügig darin, dass NULL
Datenelemente gleich miteinander verglichen werden.
Ein weiteres Beispiel mit cross apply. Die Idee ist, a0, a1, ... in Zeilen zu transponieren und dann zu überprüfen, wo max und min gleich sind:
quelle