2013-10-14 60 views
0

我有兩個查詢,我需要左加入第一個與第二個。目的是將所有這些內容都包含在其他更大的內容中。我同時得到了第一個和第二個查詢,但無法讓他們加入。使用ON或USING加入兩個子查詢

首先查詢:

SELECT * 
    FROM (
    SELECT Source as system, DT as ts, Status as statusCode 
    FROM (
     (SELECT 'SOURCE1' Source FROM Dual 
     UNION SELECT 'SOURCE2' FROM Dual 
     UNION SELECT 'SOURCE3' FROM Dual 
     UNION SELECT 'SOURCE4' FROM Dual 
     ) system 
     CROSS JOIN (
     SELECT 
      TO_DATE('09-30-2013','MM-DD-YYYY') - 1 + LEVEL dt 
     FROM dual 
      CONNECT BY 
     LEVEL <= (TO_DATE('10/05/2013','MM/DD/YYYY') 
       - TO_DATE('09/30/2013','MM/DD/YYYY')) + 1 
     ) ts 
     CROSS JOIN (
     SELECT 'O' Status FROM Dual 
     UNION SELECT 'C' FROM Dual 
     ) statusCode 
    )--For some reason cannot name this so need to wrap in another select * 
)Duals 

第二個查詢:(會有一個LEFT JOIN)之間在這裏

LEFT JOIN 

受審

Select * FROM(
    SELECT myTable1.system, TO_CHAR(maxResults.ts,'YYYY-MM-DD') as ts, myTable1.statusCode 
    FROM (
     SELECT table_id, MAX(ts) as ts 
     FROM myTable1_history 
     WHERE ts BETWEEN TO_TIMESTAMP('2013-09-29','yyyy-mm-dd') AND TO_TIMESTAMP('2013-10-06','yyyy-mm-dd') 
     GROUP BY table_id)maxResults 
    JOIN myTable1 
    ON maxResults.table_id = myTable1.table_id 
    WHERE myTable1.statusCode = 'C' 
    UNION ALL 
    SELECT myTable1.system as "system", TO_CHAR(myTable1.ts,'YYYY-MM-DD') as "ts", 'O' as "statusCode" 
    FROM myTable1 
    WHERE myTable1.ts BETWEEN TO_TIMESTAMP('2013-09-29','yyyy-mm-dd') AND TO_TIMESTAMP('2013-10-06','yyyy-mm-dd') 
    --AND myTable1.statusCode = 'O' 
    )Records 

USING (system, ts, statusCode) 

我試着只是在一個LEFT JOIN粘在兩個查詢中間,但沒有工作(我可能做錯了),如圖

編輯:添加了JOIN和使用與實施例的什麼不是工作,收到「無效表名」

+0

你需要他們加入什麼? – Ben

+0

「你沒有工作」是什麼意思? – StevieG

+0

@StevieG我把一個左加入之間,然後在最後使用(系統,ts,statusCode)只是從SQL Developer開始無用的錯誤消息 – Kairan

回答

0

這是猜測,假設你想加入所有列?

(SELECT * FROM (
    SELECT system, ts, statuscode 
    FROM (SELECT Source as system, DT as ts, Status as statusCode 
       FROM ((SELECT 'SOURCE1' Source FROM Dual 
          UNION SELECT 'SOURCE2' FROM Dual 
          UNION SELECT 'SOURCE3' FROM Dual 
          UNION SELECT 'SOURCE4' FROM Dual 
       ) system CROSS JOIN (SELECT TO_DATE('09-30-2013','MM-DD-YYYY') - 1 + LEVEL dt 
                    FROM dual 
                   CONNECT BY 
                    LEVEL <= (TO_DATE('10/05/2013','MM/DD/YYYY') 
                      - TO_DATE('09/30/2013','MM/DD/YYYY')) + 1 
                     ) ts CROSS JOIN (SELECT 'O' Status FROM Dual 
                            UNION SELECT 'C' FROM Dual) statusCode 
    ) 
))duals LEFT JOIN 
    (Select * FROM(
    SELECT myTable1.system, TO_CHAR(maxResults.ts,'YYYY-MM-DD') as ts, myTable1.statusCode 
    FROM (
     SELECT table_id, MAX(ts) as ts 
     FROM myTable1_history 
     WHERE ts BETWEEN TO_TIMESTAMP('2013-09-29','yyyy-mm-dd') AND TO_TIMESTAMP('2013-10-06','yyyy-mm-dd') 
     GROUP BY table_id)maxResults 
    JOIN myTable1 
    ON maxResults.table_id = myTable1.table_id 
    WHERE myTable1.statusCode = 'C' 
    UNION ALL 
    SELECT myTable1.system, TO_CHAR(myTable1.ts,'YYYY-MM-DD') as ts, 'O' as statusCode 
    FROM myTable1 
    WHERE myTable1.ts BETWEEN TO_TIMESTAMP('2013-09-29','yyyy-mm-dd') AND TO_TIMESTAMP('2013-10-06','yyyy-mm-dd') 
    --AND myTable1.statusCode = 'O' 
    ) Records ON duals.system = records.system AND duals.ts = records.ts AND duals.statusCode = records.statusCode 
+0

另外值得注意的是,最後一個「UNION ALL」命名的列與第一部分不同。您將「系統」命名爲「來源」,並且無法加入。與「時間戳」與「ts」和「狀態碼」與「狀態」類似。確保列名與您想要加入的任何內容相同。 – mayabelle

+0

只要數據類型相同就可以了 - 列名在UNION ALL中是不相關的。 – StevieG

+0

@mayabelle我認爲這是我的錯,我沒有找到/替換,以保護我們的數據庫架構,忘記更新 – Kairan