sql >> Databáze >  >> RDS >> Oracle

výstup dvou různých dotazů jako jeden výsledek v Oracle SQL

Existují dva způsoby, jak skládat dotazy dohromady:Sideways pomocí spojení a nad sebou pomocí spojení. Při použití spojení bude výsledek obsahovat sloupce obou dotazů. Při použití sjednocení bude výsledek zahrnovat řádky obou dotazů. Aby sjednocení fungovalo, musí oba dotazy vracet stejný počet odpovídajících sloupců.

Předpokládám, že chcete přidat počet vypočítaný ve druhém dotazu jako sloupec k prvnímu dotazu. Funguje to takto (používám nový JOIN syntaxe):

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

Můžete také použít INNER JOIN místo LEFT JOIN pokud víte, že dotaz2 poskytuje alespoň jeden řádek pro každý řádek dotazu1 nebo pokud vás nezajímají řádky z dotazu1, kde odpovídající řádky v dotazu2 chybí.

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;

Také bych provedl řazení po spojení dvou dílčích dotazů, protože proces spojení by mohl zničit jakoukoli dříve vytvořenou objednávku.

Existuje také problém s typy zpráv:Nevybíráte stejné typy zpráv ve dvou dílčích dotazech. V ORACLE můžete použít DECODE funkce pro překlad typů zpráv, aby se shodovaly

V dílčím dotazu 1:

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

Pokud create_time je DATE musíte převést řetězec data/času na datum.

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

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

Pokud je to možné, použijte také čtyřmístný rok. To je bezpečnější. je 31 1931 nebo 2031 ? Také číslo měsíce bude fungovat také na systémech s různými lokalitami. DEC by v německém systému nebyly uznány. Místo toho DEZ by se dalo očekávat.



  1. MySQL běží celkem s COUNT

  2. Rozdělit hodnoty oddělené čárkami ve sloupci MYSQL

  3. Jak zkrátit TABLE v Oracle

  4. uložení roku do databáze