Das folgende Bild ist Teil der Microsoft SQL Server 2008 R2-Systemansichten. Aus dem Bild können wir erkennen, dass die Beziehung zwischen sys.partitions
und sys.allocation_units
vom Wert von abhängt sys.allocation_units.type
. Um sie zusammenzufügen, würde ich etwas Ähnliches 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
Der obere Code gibt jedoch einen Syntaxfehler aus. Ich denke, das liegt an der CASE
Aussage. Kann jemand helfen, ein wenig zu erklären?
Fehlermeldung hinzufügen:
Meldung 102, Ebene 15, Status 1, Zeile 6 Falsche Syntax in der Nähe von '='.
sql
sql-server
join
case
Nur ein Lernender
quelle
quelle
Antworten:
Ein
CASE
Ausdruck gibt einen Wert aus demTHEN
Teil der Klausel zurück. Sie könnten es so verwenden:Beachten Sie, dass Sie mit dem zurückgegebenen Wert etwas tun müssen, z. B. mit 1 vergleichen. Ihre Anweisung hat versucht, den Wert einer Zuweisung oder eines Gleichheitstests zurückzugeben, was im Kontext einer
CASE
/THEN
-Klausel keinen Sinn ergibt . (WennBOOLEAN
es sich um einen Datentyp handelt, ist der Test auf Gleichheit sinnvoll.)quelle
= 1
auf= 0
, aber ich denke, das Ergebnis wird Ihnen nicht gefallen.Ich empfehle Ihnen, diesen Link zu verwenden. Bedingte Verknüpfungen in SQL Server und T-SQL-Fallanweisung in einer JOIN ON-Klausel
z.B
Bearbeiten: Gemäß Kommentaren.
quelle
conditional join
heißt Jeder Join (ohne Kreuz) ist eine Bedingung. Wie unterscheidet sich dieser Fall von jedem anderen? Ihr Beispiel hat eine innere Verknüpfung mit Bedingung, und die OP-Abfrage hat eine Verknüpfung mit Bedingung.OR
?OR
". Die VerwendungOR
ist nur eine Möglichkeit, sie zu implementieren.OR
und 2ANDs
oder mit 1 einen Namen zu gebenCASE
. Es ist eine Routineabfrage, die nichts hat, was sie von anderen unterscheidet.Versuche dies:
quelle
Ich denke, Sie brauchen zwei Fallaussagen:
Das ist weil:
quelle
Ich habe Ihr Beispiel genommen und es bearbeitet:
quelle
Das scheint schön
https://bytes.com/topic/sql-server/answers/881862-joining-different-tables-based-condition
quelle
Ja, du kannst. Hier ist ein Beispiel.
quelle
Hat DonkeyKongs Beispiel genommen.
Das Problem ist, dass ich eine deklarierte Variable verwenden muss. Auf diese Weise können Sie auf der linken und rechten Seite angeben, was Sie vergleichen möchten. Dies dient zur Unterstützung eines SSRS-Berichts, bei dem je nach Auswahl durch den Benutzer verschiedene Felder verknüpft werden müssen.
Im ersten Fall wird die Feldauswahl basierend auf der Auswahl festgelegt, und dann kann ich das Feld festlegen, auf das ich für den Join passen möchte.
Eine zweite case-Anweisung könnte für die rechte Seite hinzugefügt werden, wenn die Variable zur Auswahl aus verschiedenen Feldern benötigt wird
quelle
Hier habe ich den Unterschied in zwei verschiedenen Ergebnismengen verglichen:
quelle