Oracle
 sql >> база данни >  >> RDS >> Oracle

извеждане на две различни заявки като един резултат в oracle SQL

Има два начина за обединяване на заявки:настрани чрез използване на обединения и един върху друг с обединения. Когато използвате обединения, резултатът ще включва колони и от двете заявки. Когато използвате обединения, резултатът ще включва редове и от двете заявки. За да работят обединенията, и двете заявки трябва да върнат еднакъв брой съответстващи колони.

Предполагам, че искате да добавите броя, изчислен във втората заявка, като колона към първата заявка. Това работи по следния начин (използвам новия 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 или ако не се интересувате от редове от query1, където съответните редове липсват от 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;

Също така бих направил сортирането след съединяването на двете подзаявки, тъй като процесът на обединяване може да унищожи всеки установен преди това ред.

Има също проблем с типовете съобщения:не избирате едни и същи типове съобщения в двете подзаявки. В 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 )

Използвайте и четирицифрена година, ако е възможно. Така е по-безопасно. Е 31 1931 или 2031 ? Също така, номерът на месеца ще работи и на системи с различни локали. DEC няма да се разпознае в немска система. Вместо DEZ би се очаквало.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. В Oracle 11g как определяте средното тегло на данните на час между две дати?

  2. regex за намиране и избягване на двойни точки в Oracle

  3. REGEXP Подниз Oracle

  4. Как да получите най-десните 10 места на низ в Oracle

  5. Грешка:PLS-00428:Очаква се клауза into в този оператор за избор