簡體   English   中英

如何在Oracle SQL中聯接多個臨時表(使用with子句)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM