2017-06-09 3 views
0

Ich habe Hochs und Tiefs nach einer Antwort gesucht, aber ich finde nicht ein ...SQL Server Unterabfragen in Fall ist, dann mit mehreren JOINS

Ich versuche, eine Unterabfrage in einer CASE THEN Anweisung auszuführen, basierend auf Qualifier, geht das so etwas wie diese:

SELECT 
    CASE 
     WHEN cbpotm.DOLCheck LIKE '%<%' 
     THEN 
     (
      SELECT 
       ... 
      FROM #AnotherTempTable AS CB 
      LEFT OUTER JOIN ... 
      LEFT OUTER JOIN ... 
      LEFT OUTER JOIN ... 
      WHERE CONDITION AND CONDITION 
      AND CONDITION IN (1, 2, 3, 4) 
      AND CAST(SUBSTRING(CAST(tflr.DateKey AS VARCHAR), 1, 4) + '-' + SUBSTRING(CAST(tflr.DateKey AS VARCHAR), 5, 2) + '-' + SUBSTRING(CAST(tflr.DateKey AS VARCHAR), 7, 2) AS DATE) BETWEEN CB.SomeDate AND CB.SomeOtherDate 
      GROUP BY FIELD, FIELD 
     ) 
     END 
FROM  
#TempTable cbpotm 

Offenbar fehlt ich die Marke, weil ich nicht erlaubt bin mehr zu haben, als ein JOIN innerhalb der CASE THEN ohne mit einer EXISTS Klausel der Erklärung einzuführen.
Ich versuche nicht, die Aussage mit irgendetwas zu vergleichen, also kann ich nicht sehen, warum ich nur ein einzelnes Feld verwenden sollte, um damit zu konkurrieren? Ich sehe auch nicht, warum sollte ich EXISTS verwenden, weil ich nicht die Validierung durchgeführt ich versucht ...

+2

Das Prädikat des 'THEN' in Ihrem' CASE 'Ausdruck muss einen einzelnen skalaren Wert zurückgeben. Diese Unterabfrage sieht sehr verdächtig aus. Vielleicht möchten Sie Ihre Frage mit Beispieldaten und der erwarteten Ausgabe aktualisieren, um uns zu zeigen, was Sie hier tun möchten. –

+0

'CASE' ist ein * Ausdruck *, keine Aussage. Es erzeugt einen einzelnen Skalarwert * (pro Zeile). Ist das, was Ihre Unterabfrage zu generieren versucht? I.e. Wenn Sie den "CASE" vollständig entfernen und nur als Unterabfrage in der SELECT-Klausel haben, funktioniert das? –

+0

Es scheint, dass die temporären Tabellen in der äußeren und Unterabfrage basierend auf Ihrer Qualifikationsbedingung verknüpft werden sollten und in diesem Fall "case when" nicht benötigt wird, nehme ich an. – Coder1991

Antwort

0

versuchen, etwas wie folgt aus:

SELECT * 
FROM  
#TempTable cbpotm 
outer apply 
(
      SELECT * 
      FROM #AnotherTempTable AS CB 
      LEFT OUTER JOIN ... 
      LEFT OUTER JOIN ... 
      LEFT OUTER JOIN ... 
      WHERE CONDITION AND CONDITION 
      AND CONDITION IN (1, 2, 3, 4) 
      AND CAST(SUBSTRING(CAST(tflr.DateKey AS VARCHAR), 1, 4) + '-' + SUBSTRING(CAST(tflr.DateKey AS VARCHAR), 5, 2) + '-' + SUBSTRING(CAST(tflr.DateKey AS VARCHAR), 7, 2) AS DATE) BETWEEN CB.SomeDate AND CB.SomeOtherDate 
      AND cbpotm.DOLCheck LIKE '%<%' 
      GROUP BY FIELD, FIELD 

) tmp 
+0

Ich wäre diesen Weg gegangen, aber ich mache einen Datumsvergleich, weshalb ich in einer 'if' Anweisung nach '<' or '>' suche, damit ich eine bestimmte Abfrage basierend auf dem Rückgabeergebnis ausführen kann. – GrammatonCleric