0

我有两个查询,我需要将第一个与第二个 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 作为不起作用的示例,收到“无效的表名”

4

1 回答 1

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
于 2013-10-14T15:46:50.767 回答