sql >> Database teknologi >  >> RDS >> Oracle

output af to forskellige forespørgsler som ét resultat i oracle SQL

Der er to måder at sætte forespørgsler sammen på:Sidelæns ved at bruge joins og oven på hinanden med fagforeninger. Når du bruger joinforbindelser, vil resultatet inkludere kolonner for begge forespørgsler. Når du bruger fagforeninger, vil resultatet inkludere rækker af begge forespørgsler. For at fagforeninger skal fungere, skal begge forespørgsler returnere det samme antal tilsvarende kolonner.

Jeg går ud fra, at du vil tilføje antallet beregnet i den anden forespørgsel som kolonne til den første forespørgsel. Dette fungerer sådan her (jeg bruger den nye JOIN). syntaks):

SELECT
    q1.x, q1.y, q2.z, ...
FROM
    (SELECT ... FROM ...) q1
    LEFT JOIN
    (SELECT ... FROM ...) q2
        ON q1.column = q2.column

Du kan også bruge INNER JOIN i stedet for LEFT JOIN hvis du ved, at forespørgsel2 giver mindst én række for hver række af forespørgsel1, eller hvis du ikke er interesseret i rækker fra forespørgsel1, hvor tilsvarende rækker mangler fra forespørgsel2.

SELECT 
    q1.message_type,
    q1.queue_seqnum,
    q1.files,
    q2.message_count
FROM (SELECT
         a.message_type,
         a.queue_seqnum,
         SUBSTR(b.char_data, 1, 2) files
      FROM
         ad_in_messageheader a,
         INNER JOIN ad_in_messagedetail b
            ON  a.queue_seqnum = b.queue_seqnum 
      WHERE
         a.message_type IN ('ERP_COSTS_SMRY', 'ERP_SALES_SMRY', 'ERP_SPEND_SMRY') AND
         a.create_time > '17-DEC-13 07.00.00 AM') q1
   LEFT JOIN
     (SELECT
         a.message_type,
         COUNT(a.message_type) message_count
      FROM
         ad_in_messageheader a 
      WHERE
         a.message_type IN ('ERP_COSTS', 'ERP_SALES', 'ERP_SPEND') AND
         create_time > '17-DEC-13 07.00.00 AM'
      GROUP BY
         a.message_type) q2
   ON q1.message_type = q2.message_type
ORDER BY
   q1.queue_seqnum DESC;

Jeg ville også sortere efter sammenføjning af de to underforespørgsler, fordi sammenføjningsprocessen kunne ødelægge enhver ordre etableret før.

Der er også et problem med meddelelsestyperne:Du vælger ikke de samme meddelelsestyper i de to underforespørgsler. I ORACLE kan du bruge DECODE funktion til at oversætte meddelelsestyperne for at få dem til at matche

I underforespørgsel 1:

SELECT
    DECODE(a.message_type,
           'ERP_COSTS_SMRY', 'ERP_COSTS', 
           'ERP_SALES_SMRY', 'ERP_SALES',
           'ERP_SPEND_SMRY', 'ERP_SPEND') message_type

Hvis create_time er en DATE kolonne, skal du konvertere dato/klokkeslæt strengen til en dato.

WHERE
    a.create_time > TO_DATE('17-12-2013 19:00:00', 'DD-MM-YYYY HH24:MI:SS')

(Se https://stackoverflow.com/a/10178346/880990 )

Brug også et firecifret årstal, hvis det er muligt. Dette er mere sikkert. Er 31 1931 eller 2031 ? Et månedsnummer vil også fungere på systemer med forskellige lokaliteter. DEC ville ikke blive anerkendt på et tysk system. I stedet for DEZ ville forventes.



  1. Brug af Select Query i en while-løkke i php

  2. SQL-rækkefølge efter elementer fra IN-sætning

  3. Fordele og ulemper ved at bruge lagrede procedurer

  4. R:strengliste i ifelse