使用ON或USING加入两个子查询

时间:2013-10-14 15:38:57

标签: sql oracle join subquery

我有两个查询需要LEFT JOIN第一个与第二个。目的是将所有这些包含在其他更大的内容中。我得到了第一个和第二个查询单独工作,但无法让他们加入。

第一次查询:

  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和USING作为不起作用的示例,收到“无效的表名”

1 个答案:

答案 0 :(得分: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
相关问题