Das folgende Bild ist ein Teil von Microsoft SQL Server 2008 R2 System Views. Anhand des Bildes können wir sehen, dass die Beziehung zwischen "sys.partitions" und "sys.allocation_units" vom Wert von "sys.allocation_units.type" abhängt. Um sie miteinander zu verbinden, würde ich also etwas Ähnliches wie das hier schreiben:
SELECT *
FROM sys.indexes i
JOIN sys.partitions p
ON i.index_id = p.index_id
JOIN sys.allocation_units a
ON CASE
WHEN a.type IN (1, 3)
THEN a.container_id = p.hobt_id
WHEN a.type IN (2)
THEN a.container_id = p.partition_id
END
Aber der obere Code gibt einen Syntaxfehler. Ich vermute, das liegt an der CASE
-Anweisung.
Kann jemand helfen, das ein wenig zu erklären?
Fehlermeldung hinzufügen:
Msg 102, Level 15, State 1, Line 6 Falsche Syntax bei '='.
Ein "CASE"-Ausdruck gibt einen Wert aus dem "THEN"-Teil der Klausel zurück. Sie können ihn folgendermaßen verwenden:
SELECT *
FROM sys.indexes i
JOIN sys.partitions p
ON i.index_id = p.index_id
JOIN sys.allocation_units a
ON CASE
WHEN a.type IN (1, 3) AND a.container_id = p.hobt_id THEN 1
WHEN a.type IN (2) AND a.container_id = p.partition_id THEN 1
ELSE 0
END = 1
Beachten Sie, dass Sie etwas mit dem zurückgegebenen Wert tun müssen, z.B. ihn mit 1 vergleichen. Ihre Anweisung versucht, den Wert einer Zuweisung zurückzugeben oder auf Gleichheit zu testen, was beides im Kontext einer CASE
/THEN
-Klausel keinen Sinn macht. (Wenn BOOLEAN
ein Datentyp wäre, würde der Test auf Gleichheit Sinn machen).
Stattdessen JOINen Sie einfach auf beide Tabellen und geben in Ihrer SELECT-Klausel
Daten aus der übereinstimmenden Tabelle zurückgeben:
Ich empfehle Ihnen, diesen Link Conditional Joins in SQL Server und https://stackoverflow.com/questions/8361183/t-sql-case-statement-in-a-join-on-clause durchzulesen.
z.B..
SELECT *
FROM sys.indexes i
JOIN sys.partitions p
ON i.index_id = p.index_id
JOIN sys.allocation_units a
ON a.container_id =
CASE
WHEN a.type IN (1, 3)
THEN p.hobt_id
WHEN a.type IN (2)
THEN p.partition_id
END
Bearbeiten: Wie in den Kommentaren.
Sie können die Join-Bedingung nicht so angeben, wie Sie es gerade tun. Prüfen Sie die
Abfrage oben, die keinen Fehler haben. Ich habe die gemeinsame Spalte oben herausnehmen und die rechte Spalte Wert wird auf Bedingung ausgewertet werden.
Versuchen Sie dies:
...JOIN sys.allocation_units a ON
(a.type=2 AND a.container_id = p.partition_id)
OR (a.type IN (1, 3) AND a.container_id = p.hobt_id)