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ć.