如何在JOIN中的JOIN中引用字段?
问题描述:
在JOIN语句中的子查询中选择特定字段时,使用点符号来引用table.field_name,但是,在第一个JOIN中使用另一个子查询JOIN时要执行什么操作?如何在JOIN中的JOIN中引用字段?
我的JOIN瓦特/例如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:含糊不清的列,因此似乎有什么问题都用completed_date
答
使用条件汇总:
SELECT t.protocol_id,
MAX(CASE WHEN task_name LIKE 'Budget%' THEN completed_date END) as budget_completed_date,
. . .
FROM task t
GROUP BY protocol_id;
我不太清楚如何task_list_id
结合使用。您可能也希望通过这种方式进行汇总。
答
如果需要访问的子查询子查询的栏目,然后简单地在中间的子查询SELECT
使用它们:中
SELECT middle_subquery.c1
FROM
(
SELECT inner_subquery.c1
FROM
(
SELECT count(*) c1 FROM tab
) inner_subquery
) middle_subquery
代替
SELECT middle_subquery.inner_subquery.c1
FROM
(
SELECT *
FROM
(
SELECT count(*) c1 FROM tab
) inner_subquery
) middle_subquery
答
采取了一些了解,但我认为我得到了雅。
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
...
)task
因此,'budget.completed_date'现在可以称为'task.completed_date'。所以pc.completed_date等也可以mgr.completed_date等这是它的困惑。只是别名:
SELECT
BUDGET.protocol_id as budget_protocol_id
BUDGET.completed_date as budget_completed_date,
SELECT
BUDGET.protocol_id, BUDGET.completed_date,
CONTRACT.completed_date as contract_completed_date,
REQUEST.completed_date as request_completed_date,
RECEIVE.completed_date as receive_completed_date,
etc
...
)task
这将让每个task.complete_date独特的,你可以参考他们从那里进行task.budget_completed_date。合理?
如果你运行你发布的所有代码(减去'JOIN('开始它),它运行吗?它对我来说看起来很好,所以我的猜测是你的错误是在外部选择或分组。 –
The子查询的自我肯定运行,尽管缓慢。问题来了,当我在主要查询SELECT语句中添加: 'TASK.BUDGET.completed_date, TASK.CONTRACT.completed_date, TASK.REQUEST.completed_date, TASK.RECEIVE。 completed_date, TASK.PC.completed_date,\t TASK.FC.completed_date, TASK.MGR.completed_date” ,其抛出00918误差 – Dan
)TASK ON PCL.pro tocol_id = TASK.BUDGET.protocol_id - 其中是哪个开放式支架?每个子查询都被认为是最好的,因为它是自己的表......它中的所有东西都是自包含的,不能引用它之外的任何对象。 task.budget.completed_date永远不会是正确的引用。编辑:如果你没有那个任务参考,这是有效的,不是?你会想要在每个子查询中别名,以避免混淆(SELECT completed_date as budget_completed_date)或类似的东西 – Twelfth