Oracle
 sql >> Baza danych >  >> RDS >> Oracle

wyjście dwóch różnych zapytań w jednym wyniku w Oracle SQL

Istnieją dwa sposoby łączenia zapytań:bocznie przy użyciu sprzężeń i nad sobą za pomocą związków. W przypadku użycia złączeń wynik będzie zawierał kolumny obu zapytań. W przypadku używania unii wynik będzie zawierał wiersze obu zapytań. Aby unie działały, oba zapytania muszą zwracać tę samą liczbę odpowiednich kolumn.

Zakładam, że chcesz dodać liczbę obliczoną w drugim zapytaniu jako kolumnę do pierwszego zapytania. Działa to w ten sposób (używam nowego JOIN składnia):

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

Możesz także użyć INNER JOIN zamiast LEFT JOIN jeśli wiesz, że zapytanie2 daje co najmniej jeden wiersz dla każdego wiersza zapytania1 lub jeśli nie interesują Cię wiersze z zapytania1, w których brakuje odpowiednich wierszy w zapytaniu2.

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;

Dokonałbym również sortowania po połączeniu dwóch zapytań podrzędnych, ponieważ proces łączenia mógłby zniszczyć każdą ustaloną wcześniej kolejność.

Istnieje również problem z typami wiadomości:nie wybierasz tych samych typów wiadomości w dwóch podzapytaniach. W ORACLE możesz użyć DECODE funkcja tłumaczenia typów wiadomości w celu dopasowania ich do siebie

W podzapytaniu 1:

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

Jeśli create_time to DATE kolumna, musisz przekonwertować ciąg daty/godziny na datę.

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

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

Jeśli to możliwe, użyj również czterocyfrowego roku. To jest bezpieczniejsze. Czy 31 1931 lub 2031 ? Również numer miesiąca będzie działał również w systemach z różnymi lokalizacjami. DEC nie zostanie rozpoznany w systemie niemieckim. Zamiast tego DEZ można by się spodziewać.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. problem z użyciem parametrów Oracle w SELECT IN

  2. Zapytanie z uszkodzonym podselekcję powinno skutkować błędem, ale zwraca wiersze

  3. Jak mogę w rozsądny sposób rejestrować instrukcje UPDATE przy użyciu rejestrowania sterownika Oracle?

  4. przekroczyć limit 32k podczas wstawiania parametru Oracle clob IN za pomocą sprężyny StoredProcedure

  5. Praktyczne przykłady użycia kursora Oracle w sposób wyraźny