sql >> Database >  >> RDS >> Oracle

uitvoer van twee verschillende query's als één resultaat in Oracle SQL

Er zijn twee manieren om queries samen te stellen:zijdelings door gebruik te maken van joins en op elkaar met unions. Als u joins gebruikt, bevat het resultaat kolommen van beide query's. Als u vakbonden gebruikt, bevat het resultaat rijen van beide query's. Om vakbonden te laten werken, moeten beide zoekopdrachten hetzelfde aantal corresponderende kolommen retourneren.

Ik neem aan dat je het aantal berekend in de tweede query als kolom wilt toevoegen aan de eerste query. Dit werkt als volgt (ik gebruik de nieuwe JOIN syntaxis):

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

Je kunt ook INNER JOIN . gebruiken in plaats van LEFT JOIN als u weet dat query2 ten minste één rij oplevert voor elke rij van query1 of als u niet geïnteresseerd bent in rijen uit query1 waar overeenkomstige rijen ontbreken in 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;

Ik zou ook de sortering doen na het samenvoegen van de twee subquery's, omdat het samenvoegingsproces elke eerder vastgestelde volgorde zou kunnen vernietigen.

Er is ook een probleem met de berichttypes:u selecteert niet dezelfde berichttypes in de twee subquery's. In ORACLE kun je de DECODE . gebruiken functie om de berichttypes te vertalen zodat ze overeenkomen

In subquery 1:

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

Als create_time is een DATE kolom, moet u de datum/tijd-tekenreeks naar een datum converteren.

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

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

Gebruik indien mogelijk ook een jaartal van vier cijfers. Dit is veiliger. Is 31 1931 of 2031 ? Ook werkt een maandnummer ook op systemen met verschillende landinstellingen. DEC zou niet worden herkend op een Duits systeem. In plaats daarvan DEZ zou worden verwacht.



  1. Seconden uit intervaltabel halen / record naar interval casten?

  2. Databasetoegang met Angular

  3. SQL Server - Kortsluiting opvragen?

  4. MySQL 5, Simple Membership Provider, ASP.NET MVC4 met Entity Framework 5 gebruiken