【发布时间】:2017-10-18 18:55:22
【问题描述】:
在 JOIN 语句中选择子查询中的特定字段时,您使用点表示法来引用 table.field_name,但是,当在第一个 JOIN 中使用另一个子查询 JOIN 时该怎么办?
我的 JOIN w/in JOIN 示例:
JOIN (SELECT
BUDGET.protocol_id, BUDGET.completed_date,
CONTRACT.completed_date,
REQUEST.completed_date,
RECEIVE.completed_date,
PC.completed_date,
FC.completed_date,
MGR.completed_date
FROM (SELECT completed_date, task_list_id, protocol_id FROM task WHERE task_name LIKE 'Budget%') BUDGET
JOIN (SELECT completed_date, task_list_id, protocol_id FROM task WHERE task_name LIKE 'Contract%') CONTRACT
ON BUDGET.protocol_id = CONTRACT.protocol_id
AND BUDGET.task_list_id = CONTRACT.task_list_id
JOIN (SELECT completed_date, task_list_id, protocol_id FROM task WHERE task_name LIKE 'Request%') REQUEST
ON BUDGET.protocol_id = REQUEST.protocol_id
AND BUDGET.task_list_id = REQUEST.task_list_id
JOIN (SELECT completed_date, task_list_id, protocol_id FROM task WHERE task_name LIKE 'Protocol%') PC
ON BUDGET.protocol_id = PC.protocol_id
AND BUDGET.task_list_id = PC.task_list_id
JOIN (SELECT completed_date, task_list_id, protocol_id FROM task WHERE task_name LIKE 'Financials%') FC
ON BUDGET.protocol_id = FC.protocol_id
AND BUDGET.task_list_id = FC.task_list_id
JOIN (SELECT completed_date, task_list_id, protocol_id FROM task WHERE task_name LIKE 'Manager%') MGR
ON BUDGET.protocol_id = MGR.protocol_id
AND BUDGET.task_list_id = MGR.task_list_id
JOIN (SELECT completed_date, task_list_id, protocol_id FROM task WHERE task_name LIKE 'Receive%') RECEIVE
ON BUDGET.protocol_id = RECEIVE.protocol_id
AND BUDGET.task_list_id = RECEIVE.task_list_id
) TASK ON PCL.protocol_id = TASK.BUDGET.protocol_id
我一直在尝试对子查询做的是选择特定任务的完成日期,因此在 SELECT 语句中,我的直觉是对每个任务使用 TASK.BUDGET.completed_date。然而,我得到一个 ORA-00918: column ambiguously defined,所以使用 completed_date 的所有内容似乎都有问题
【问题讨论】:
-
如果您运行您发布的所有代码(减去开头的
JOIN (),它会运行吗?对我来说看起来不错,所以我猜你的错误是在外部选择或分组上。 -
子查询它自己肯定会运行,尽管速度很慢。问题出现在我添加的主查询 SELECT 语句中:'TASK.BUDGET.completed_date, TASK.CONTRACT.completed_date, TASK.REQUEST.completed_date, TASK.RECEIVE.completed_date, TASK.PC.completed_date, TASK.FC.completed_date , TASK.MGR.completed_date' 抛出 00918 错误
-
) TASK ON PCL.protocol_id = TASK.BUDGET.protocol_id -- 指向那个的左括号在哪里?每个子查询最好被认为是它自己的表......其中的所有内容都是自包含的,不能引用它之外的任何对象。 task.budget.completed_date 永远不会是正确的引用。编辑:如果您没有该任务参考,这可行,不是吗?您将要为每个子查询中的列加上别名以避免混淆(SELECT completed_date as budget_completed_date)或类似的东西
-
正确的别名应该只是
TASK.completed_date...BUDGET的内部别名不会传递给外部查询。只有子查询/派生表别名将 (TASK)。 -
类似地,为每个
completed_date列赋予自己的别名。即..CONTRACT.completed_date AS ContractCompletedDate然后从外部查询中的列名中选择它们。即..TASK.ContractCompletedDate
标签: sql join inner-join