2017-09-27 4 views
0

Ich habe Abfrage, dass das Ergebnis ein einzelner Wert ist es gibt viele Fälle, die mir einen Nullwert in diesem Fall bringen, das ist was ich nicht brauche, also muss ich eine andere Abfrage, um mir einen Wert zurück zu bringen , also muss ich eine Abfrage erstellen, die mich zurückbringt, wenn der Nullwert in der ersten Abfrage das Ergebnis auslässt und die zweite Abfrage ausführt.Wählen Sie aus zwei Abfragen wählen Sie nicht null

die firts Abfrage ist

SELECT DISTINCT 
      FIRST_VALUE (pac1.pac_name) 
       OVER (ORDER BY pac1.pac_final_date DESC) 
     FROM matricula mac 
      INNER JOIN 
       periodo pac1 
      ON mac.pac_id = pac1.pac_id 
    WHERE mac.ent_id = 26172 AND mac.mac_estado IN (8072, 10221) 

die zweite Abfrage ist

SELECT DISTINCT 
       FIRST_VALUE (pac1.pac_name) 
       OVER (ORDER BY pac1.pac_final_date DESC) 
     FROM registro rea 
       INNER JOIN 
       periodo pac1 
       ON rea.pac_id = pac1.pac_id 
     WHERE rea.ent_id = 26172 

Die beiden Abfragen bringt mir den gleichen Wert zurück, aber zuerst muss ich für die erste Abfrage konsultieren, gibt es zwei Fälle.

Fall -1 -> wenn Abfrage # 1 ausgeführt werden und bringt mir das Ergebnis

Ergebnis

FIRST_VALUE (pac1.pac_name) 
-------------------------- 
|Oct/2012 - Feb/2013  | 
-------------------------- 

Fall -2 -> wenn Abfrage # 1 das Ergebnis null ist ausführen, dann ausführen eine Abfrage # 2, die einen Wert bringen wird mir versichern

Ergebnis

FIRST_VALUE (pac1.pac_name) 
-------------------------- 
|Oct/2012 - Feb/2013  | 
-------------------------- 

Dies ist wahrscheinlich eine einfache Frage, aber jede Hilfe wird geschätzt.

+0

Bitte geben Sie einige Beispieldaten und das gewünschte Ergebnis. –

+0

Veröffentlichen Sie Ihre Erläuterungen nicht in Kommentaren. Verwenden Sie stattdessen [Bearbeiten]. –

+0

Ich fragte nach Beispiel ** Daten ** im Tabellenformat und das Ergebnis als Tabelle. –

Antwort

0
SELECT COALESCE(

    (SELECT DISTINCT 
      FIRST_VALUE (pac1.pac_name) 
       OVER (ORDER BY pac1.pac_final_date DESC) 
     FROM matricula mac 
      INNER JOIN 
       periodo pac1 
      ON mac.pac_id = pac1.pac_id 
     WHERE mac.ent_id = 26172 AND mac.mac_estado IN (8072, 10221)) 

    ,(SELECT DISTINCT 
       FIRST_VALUE (pac1.pac_name) 
       OVER (ORDER BY pac1.pac_final_date DESC) 
     FROM registro rea 
       INNER JOIN 
       periodo pac1 
       ON rea.pac_id = pac1.pac_id 
     WHERE rea.ent_id = 26172)) 

Ich bin nicht positiv, ohne Testdaten und ein paar mehr Dinge, aber man könnte auch als Haupttabelle verwendet periodische und dann LEFT OUTER zu den anderen zwei Tabellen JOIN. Verwenden Sie einen CASE-Ausdruck, um zu bestimmen, welche Tabelle/Zeilen in Ihrer Reihenfolge zuerst verwendet werden sollen. eine ähnliche Methode mit EXISTS könnte auch wahrscheinlich in Betracht gezogen werden:

SELECT DISTINCT FIRST_VALUE(pac1.pac_name) OVER (ORDER BY 
    CASE WHEN mac.pac_id IS NOT NULL THEN 0 ELSE 1 END, pac1.pac_final_date DESC) 
FROM 
    periodo pac1 
    LEFT JOIN matricula mac 
    ON pac1.pac_id = mac.pac_id 
    AND mac.ent_id = 26172 
    AND mac.mac_estado IN (8072, 10221) 
    LEFT JOIN registro rea 
    ON pac1.pac_id = rea.pac_id 
    AND rea.ent_id = 26172 
+0

Wenn Sie in den beiden Abfragen sehen, die ich in der Anweisung 'FROM' verwenden, haben sie verschiedene Tabellen –

+0

@ByronFigueroa, also habe ich eine Antwort bearbeitet, um Ihnen zu zeigen, wie Sie COALESCE verwenden können und Unterabfragen. Je nach Beziehung und einigen anderen Dingen können Sie dies in einer anderen Abfrage tun. Und jetzt, da ich die Abfragen noch einmal anschaue, könnten Sie periodo als Haupttabelle bedingte linke Outer-Joins zu beiden anderen Tabellen verwenden und sie trotzdem in 1 Abfrage abziehen – Matt