【问题标题】:Using Left Join in 3 tables在 3 个表中使用左连接
【发布时间】:2014-01-27 06:38:01
【问题描述】:

我正在尝试使用 LEFT JOIN 连接 3 个表,但我总是出错。请帮帮我。

谢谢

我想要的输出:

Name            Date              Open               Close
POS             01/01/2014         4                  10
ONE             01/02/2014         6                  5
...
...
...

我的查询:

SELECT 'Data'
||','||TO_CHAR(D.DTIME_DAY,'MM/dd/yyyy')
||','||NVL(o.CNT_OPENED,0) --as cnt_opened
||','||NVL(c.CNT_CLOSED,0) --as cnt_closed
||','||q.NAME
FROM OWNER_DWH.DC_DATE d
LEFT JOIN APP_ACCOUNT.OTRS_QUEUE q
ON t.queue_id = q.id
LEFT JOIN (
SELECT TRUNC(t.CREATE_TIME) AS report_date,count(*) AS cnt_opened
FROM APP_ACCOUNT.OTRS_TICKET t
WHERE t.CREATE_TIME BETWEEN SYSDATE -120 AND SYSDATE
GROUP BY TRUNC(t.CREATE_TIME)
) o ON d.DTIME_DAY=o.REPORT_DATE
LEFT JOIN (
SELECT TRUNC(t.CLOSE_TIME) as report_date,count(*) AS cnt_closed
FROM APP_ACCOUNT.OTRS_TICKET t
WHERE t.CLOSE_TIME BETWEEN SYSDATE -120 AND SYSDATE
GROUP BY TRUNC(t.CLOSE_TIME)
) c ON D.DTIME_DAY=c.REPORT_DATE
WHERE d.DTIME_DAY BETWEEN SYSDATE -120 AND TRUNC(SYSDATE) -1
AND d.DTIME_DAY = TRUNC(d.DTIME_DAY)
AND TRUNC(d.DTIME_DAY)= d.DTIME_DAY
ORDER BY D.DTIME_DAY;

【问题讨论】:

  • 删除第 8 行中的; 并尝试ON t.queue_id = q.id
  • 您的错误有什么花言巧语吗?
  • ORA-00904: "T"."QUEUE_ID": 无效标识符@wruckie
  • 我已经删除了 ;在我的查询中,我仍然有一个错误@Dba
  • 那是因为你需要在 FROM 子句中声明一个表,然后再尝试在 JOIN 条件中使用它。

标签: sql oracle plsql oracle-sqldeveloper plsqldeveloper


【解决方案1】:

您的第一个左连接中没有“t”的任何表别名。所以 oracle 在连接条件下还不知道t.queue_id 中的“t”是什么

ON t.queue_id = q.id

来自您的代码:

SELECT 'Data'
||','||TO_CHAR(D.DTIME_DAY,'MM/dd/yyyy')
||','||NVL(o.CNT_OPENED,0) --as cnt_opened
||','||NVL(c.CNT_CLOSED,0) --as cnt_closed
||','||q.NAME
FROM OWNER_DWH.DC_DATE d
LEFT JOIN APP_ACCOUNT.OTRS_QUEUE q
ON t.queue_id = q.id
LEFT JOIN (
SELECT TRUNC(t.CREATE_TIME) AS report_date,count(*) AS cnt_opened
FROM APP_ACCOUNT.OTRS_TICKET t
WHERE t.CREATE_TIME BETWEEN SYSDATE -120 AND SYSDATE
GROUP BY TRUNC(t.CREATE_TIME)
)

别名“t”在块内定义:

LEFT JOIN ( 
SELECT TRUNC(t.CREATE_TIME) AS report_date,count(*) AS cnt_opened
FROM APP_ACCOUNT.OTRS_TICKET t
WHERE t.CREATE_TIME BETWEEN SYSDATE -120 AND SYSDATE
GROUP BY TRUNC(t.CREATE_TIME)
)

现在,由于连接 ON t.queue_id = q.id 位于此块之外(括号外),因此别名“t”此时不可用。

因此出现错误。

【讨论】:

  • 我把 LEFT JOIN APP_ACCOUNT.OTRS_QUEUE q ON t.queue_id = q.id 在 LEFT JOIN (SELECT TRUNC(t.CREATE_TIME) AS report_date,count(*) AS cnt_opened FROM APP_ACCOUNT.OTRS_TICKET t WHERE t.CREATE_TIME BETWEEN SYSDATE -120 AND SYSDATE GROUP BY TRUNC(t.CREATE_TIME) ) o ON d.DTIME_DAY=o.REPORT_DATE 但我仍然有错误
  • 我已经进一步解释了我的答案。希望你明白这一点。查询是您写的还是其他人写的?因为如果你有,那么我怀疑你需要先了解编程中的一些基本概念。
猜你喜欢
  • 1970-01-01
  • 2023-04-05
  • 2014-10-29
  • 1970-01-01
  • 2019-03-29
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多