[英]How to join multiple temp tables (using with clause) in Oracle SQL
我創建了多個臨時表,希望將它們鏈接到一個結果集中。
我只能獲得使用with子句創建的單個臨時表,但不知道如何將它們連接在一起。 有一個主鍵字段是file_id,將所有三個表連接在一起。
WITH file_data AS (
SELECT fd.file_id, fd.receivedate, fd.datestart, fd.dateend
FROM trans_detail td join file_detail fd
on fd.receivedate between '1 Jun 2019' and '30 Jun 2019'
)
WITH tran_data AS (
SELECT fd.file_id, sum(td.tran_amt) as total_amt, sum(points) as
tran_points
FROM trans_detail td join file_detail fd
on td.date between fd.datestart and fd.dateend
group by fd.file_id
)
WITH adj_data AS (
SELECT fd.file_id, sum(ad.points) as adj_points
FROM adj_detail ad join file_detail fd
on adj.date between fd.datestart and fd.dateend
group by fd.file_id
)
預期的結果是
file id receivedate datestart datesend total_amt tran_points adj_points
123 1 Jun 2019 31/05/2019 9:51:50 PM 1/06/2019 9:51:50 PM
您需要使用WITH..SELECT
子句,如下所示:
WITH FILE_DATA AS (
SELECT
FD.FILE_ID,
FD.RECEIVEDATE,
FD.DATESTART,
FD.DATEEND
FROM
TRANS_DETAIL TD
JOIN FILE_DETAIL FD ON FD.RECEIVEDATE BETWEEN '1 Jun 2019' AND '30 Jun 2019'
), TRAN_DATA AS (
SELECT
FD.FILE_ID,
SUM(TD.TRAN_AMT) AS TOTAL_AMT,
SUM(POINTS) AS TRAN_POINTS
FROM
TRANS_DETAIL TD
JOIN FILE_DETAIL FD ON ( TD."DATE" BETWEEN fd.datestart and fd.dateend)
GROUP BY FD.FILE_ID
), ADJ_DATA AS (
SELECT
FD.FILE_ID,
SUM(AD.POINTS) AS ADJ_POINTS
FROM
ADJ_DETAIL AD
JOIN FILE_DETAIL FD
on (ADJ."DATE" BETWEEN FD.DATESTART AND FD.DATEEND) group BY FD.FILE_ID )
--
SELECT <COLUMNS YOU WANT IN SELECT LIST> -- PUT ALL COLUMNS WHICH YOU WANT IN OUTPUT
FROM
FILE_DATA FD
JOIN TRAN_DATA TD
ON ( FD.FILE_ID = TD.FILE_ID ) -- YOU CAN USE OUTER JOIN ACCORDING TO YOUR REQUIREMENT
JOIN ADJ_DATA AD
ON ( FD.FILE_ID = AD.FILE_ID ) -- YOU CAN USE OUTER JOIN ACCORDING TO YOUR REQUIREMENT
WHERE <PUT WHERE CONDITION HERE, IF ANY>
並且不要將oracle保留字用作任何對象名稱。 您已使用DATE
作為列名,這是oracle保留字。 嘗試重命名此列。
干杯!!
這是您可以實現的方式(檢查聯接)
WITH file_data AS (
SELECT fd.file_id, fd.receivedate, fd.datestart, fd.dateend
FROM trans_detail td join file_detail fd
on fd.receivedate between '1 Jun 2019' and '30 Jun 2019'
)
, tran_data AS (
SELECT fd.file_id, sum(td.tran_amt) as total_amt, sum(points) as
tran_points
FROM trans_detail td join file_detail fd
on td.date between fd.datestart and fd.dateend
group by fd.file_id
)
,adj_data AS (
SELECT fd.file_id, sum(ad.points) as adj_points
FROM adj_detail ad join file_detail fd
on adj.date between fd.datestart and fd.dateend
group by fd.file_id
)
select *
from file_data f
join tran_data t on t.file_id = f.file_id
join adj_data a on a.file_id = f.file_id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.