sql >> データベース >  >> RDS >> Oracle

OracleSQLの1つの結果としての2つの異なるクエリの出力

    クエリをまとめるには、2つの方法があります。結合を使用して横向きにする方法と、ユニオンを使用して相互に重ね合わせる方法です。結合を使用すると、結果には両方のクエリの列が含まれます。ユニオンを使用すると、結果には両方のクエリの行が含まれます。ユニオンが機能するには、両方のクエリが同じ数の対応する列を返す必要があります。

    2番目のクエリで計算されたカウントを列として最初のクエリに追加するとします。これは次のように機能します(新しいJOINを使用しています 構文):

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

    INNER JOINを使用することもできます LEFT JOINの代わりに query2がquery1の各行に対して少なくとも1つの行を生成することがわかっている場合、または対応する行がquery2から欠落しているquery1の行に関心がない場合。

    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;
    

    また、結合プロセスによって以前に確立された順序が破壊される可能性があるため、2つのサブクエリを結合した後に並べ替えを行います。

    メッセージタイプにも問題があります。2つのサブクエリで同じメッセージタイプを選択していません。 ORACLEでは、DECODEを使用できます メッセージタイプを変換して一致させる関数

    サブクエリ1:

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

    create_timeの場合 DATEです 列では、日付/時刻文字列を日付に変換する必要があります。

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

    https://stackoverflow.com/a/10178346/880990 を参照してください )

    また、可能であれば4桁の年を使用してください。これはより安全です。 31です 1931 または2031 ?また、月番号は、ロケールが異なるシステムでも機能します。 DEC ドイツのシステムでは認識されません。代わりにDEZ 期待されます。



    1. MySQL全文検索が一致しません

    2. 複数の値を取得するためのDjangoMySQLの個別のクエリ

    3. PostgreSQLのJSON外部キー

    4. 複数のテーブルを結合するスケジュール