Bedingte äußere Anwendung auf der Grundlage der Ergebnisse der verschiedenen äußeren gelten

Ich habe eine Abfrage, die data aus mehreren Tabellen abrufen muss. Für zwei dieser Tabellen werden die data durch eine outer apply abgerufen, da es notwendig ist, einen timebereich für die data abzufragen.

 SELECT a.DATA, b1.DATA, c1.DATA FROM TABLE_A a OUTER APPLY (SELECT TOP 1 b.[DATA] FROM TABLE_B b WHERE b.TIME_START <= a.TIME_START ) AS b1 OUTER APPLY (SELECT TOP 1 c.[DATA] FROM TABLE_C c WHERE c.TIME_START <= a.TIME_START AND c.TIME_STOP >= a.TIME_START ) AS c1 

Mein Problem ist, dass TABLE_C eine sehr große Tabelle ist und die Abfrage dieser Tabelle dauert einige time, aber ich würde nur diese Tabelle abfragen müssen, wenn das Ergebnis von TABLE_B null ist. TABLE_B ist im Vergleich zu TABLE_C ziemlich klein.

Dies ist zum Beispiel ein gültiges Ergebnis der Abfrage:

  [a.DATA] [b.DATA] [c.DATA] 1 VALUE_A VALUE_2 NULL 2 VALUE_B NULL VALUE_3 

Gibt es eine Möglichkeit, die äußere Anwendung auf TABLE_C abhängig von dem Ergebnis von TABLE_B für jede Zeile, wie im obigen Beispiel nur für Zeile 2 ausführen?

Etwas wie das:

 SELECT a.DATA , b1.DATA , c1.DATA FROM TABLE_A a OUTER APPLY ( SELECT TOP 1 b.[DATA] FROM TABLE_B b WHERE b.TIME_START <= a.TIME_START ) AS b1 OUTER APPLY ( SELECT CASE WHEN b1.[DATA] IS NULL THEN ( SELECT TOP 1 c.[DATA] FROM TABLE_C c WHERE c.TIME_START <= a.TIME_START AND c.TIME_STOP >= a.TIME_START ) ELSE NULL END AS DATA ) AS c1 

Oder:

  SELECT a.DATA , b1.DATA , c1.DATA FROM TABLE_A a OUTER APPLY ( SELECT TOP 1 b.[DATA] FROM TABLE_B b WHERE b.TIME_START <= a.TIME_START ) AS b1 OUTER APPLY ( SELECT TOP 1 c.[DATA] FROM TABLE_C c WHERE c.TIME_START <= a.TIME_START AND c.TIME_STOP >= a.TIME_START AND b1.[DATA] IS NULL ) AS c1 
 SELECT a.DATA, b1.DATA, c1.DATA FROM TABLE_A a OUTER APPLY (SELECT TOP 1 b.[DATA] FROM TABLE_B b WHERE b.TIME_START <= a.TIME_START ) AS b1 OUTER APPLY (SELECT TOP 1 c.[DATA] FROM TABLE_C c WHERE c.TIME_START <= a.TIME_START AND c.TIME_STOP >= a.TIME_START AND b1.data IS NULL ) AS c1 

Aber ich weiß nicht, was Optimierer in diesem Fall tun wird. Wird es alle data von C nehmen und danach alle datasätze mit B entfernen. Jedoch können Sie auch versuchen, die Abfrage zu duplizieren:

 SELECT a.DATA, b1.DATA, c1.DATA FROM TABLE_A a OUTER APPLY (SELECT TOP 1 b.[DATA] FROM TABLE_B b WHERE b.TIME_START <= a.TIME_START ) AS b1 OUTER APPLY (SELECT TOP 1 c.[DATA] FROM TABLE_C c WHERE c.TIME_START <= a.TIME_START AND c.TIME_STOP >= a.TIME_START AND NOT EXISTS ( SELECT * FROM TABLE_B b WHERE b.TIME_START <= a.TIME_START ) ) AS c1