【问题标题】:Join two subqueries with ON or USING使用 ON 或 USING 连接两个子查询
【发布时间】:2013-10-14 15:38:56
【问题描述】:

我有两个查询,我需要将第一个查询与第二个查询连接起来。目的是将所有这些包裹在更大的东西中。我让第一个和第二个查询都单独工作,但无法让它们加入。

第一个查询:

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

【问题讨论】:

  • 你需要他们加入什么?
  • 你说的“没用”是什么意思?
  • @StevieG 我在中间放了一个 LEFT JOIN,然后在最后放了一个 USING(system, ts, statusCode) 只是得到了来自 SQL Developer 的无用错误消息
  • @Ben USING(system, ts, statusCode)
  • 您收到了哪些无用的错误消息?

标签: sql oracle join subquery


【解决方案1】:

这是一个猜测,假设您想加入所有列?

(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

【讨论】:

  • 另外值得注意的是,最后一个“UNION ALL”对列的命名与它的第一部分不同。您将“系统”命名为“源”并且无法加入它。与“timestamp”与“ts”和“StatusCode”与“Status”类似。确保要加入的任何内容的列名相同。
  • 只要数据类型相同就可以了 - 列名在 UNION ALL 中是不相关的。
  • @mayabelle 我认为这是我的错,我做了查找/替换来保护我们的数据库架构,忘记更新了
  • 我想知道你是否错过了一对右括号
猜你喜欢
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 2012-09-05
相关资源
最近更新 更多