简体   繁体   中英

How to join multiple temp tables (using with clause) in Oracle SQL

I've created multiple temp tables which I want to link together into one result set.

I've only been able to get the individual temp tables created using with clause, but don't know how to join them together. There are primary key field is file_id to join all three tables together.

 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
) 

expected result would be

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

You need to use WITH..SELECT clause as following:

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>

And don't use oracle reserved words as any object name. You have used the DATE as column name which is oracle reserved word. Try to rename this column.

Cheers!!

This is how you can achieve (check the joins)

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM