sql >> Databasteknik >  >> RDS >> Oracle

utdata av två olika frågor som ett resultat i oracle SQL

Det finns två sätt att sätta samman frågor:i sidled genom att använda sammanfogningar och ovanpå varandra med fackföreningar. När du använder kopplingar kommer resultatet att inkludera kolumner för båda frågorna. När du använder fackföreningar kommer resultatet att inkludera rader med båda frågorna. För att fackföreningar ska fungera måste båda frågorna returnera samma antal motsvarande kolumner.

Jag antar att du vill lägga till antalet beräknade i den andra frågan som kolumn till den första frågan. Det här fungerar så här (jag använder den nya JOIN). syntax):

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

Du kan också använda INNER JOIN istället för LEFT JOIN om du vet att query2 ger minst en rad för varje rad i query1 eller om du inte är intresserad av rader från query1 där motsvarande rader saknas i query2.

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;

Jag skulle också göra sorteringen efter att ha sammanfogat de två underfrågorna, eftersom sammanfogningsprocessen kan förstöra alla beställningar som upprättats tidigare.

Det finns också ett problem med meddelandetyperna:Du väljer inte samma meddelandetyper i de två underfrågorna. I ORACLE kan du använda DECODE funktion för att översätta meddelandetyperna så att de matchar

I underfråga 1:

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

Om create_time är ett DATE kolumnen måste du konvertera datum/tid-strängen till ett datum.

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 )

Använd även ett fyrsiffrigt årtal om möjligt. Det här är säkrare. Är 31 1931 eller 2031 ? Ett månadsnummer fungerar också på system med olika lokaler. DEC inte skulle erkännas på ett tyskt system. Istället DEZ skulle förväntas.



  1. Fallgropar att undvika när du använder den nya Microsoft SSMA version 7.8

  2. Postgres 9.5 ON CONFLICT DO SELECT

  3. Använder du Django databaslager utanför Django?

  4. Har Timeout för att skaffa en anslutning efter uppgradering av Knex