2017-10-18 48 views
2

在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

+0

如果你运行你发布的所有代码(减去'JOIN('开始它),它运行吗?它对我来说看起来很好,所以我的猜测是你的错误是在外部选择或分组。 –

+0

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

+0

)TASK ON PCL.pro tocol_id = TASK.BUDGET.protocol_id - 其中是哪个开放式支架?每个子查询都被认为是最好的,因为它是自己的表......它中的所有东西都是自包含的,不能引用它之外的任何对象。 task.budget.completed_date永远不会是正确的引用。编辑:如果你没有那个任务参考,这是有效的,不是?你会想要在每个子查询中别名,以避免混淆(SELECT completed_date as budget_completed_date)或类似的东西 – Twelfth

回答

2

使用条件汇总:

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结合使用。您可能也希望通过这种方式进行汇总。

+0

谢谢@Gordon Linoff。我是新来的,所以我不熟悉条件聚合。你有任何我可以从中学到更多的参考? 我认为即使速度较慢,我也会尝试使用别名快速修复,然后了解有关条件聚合的更多信息以优化 – Dan

+0

@Dan。 。 。这似乎是您的代码的一个主要简化,一个聚合查询,而不是大量的连接。 –

+0

你说得对,放在更大的查询中时工作得更好。谢谢。 – Dan

0

如果需要访问的子查询子查询的栏目,然后简单地在中间的子查询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 
1

采取了一些了解,但我认为我得到了雅。

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。合理?

+0

你明白了。别名是问题。仍然是一个非常缓慢的操作,但我会在稍后进行优化。谢谢 – Dan

+0

看看Gordon的速度提升的答案......当它可以更有效地完成时,您几乎可以在这里进行7次全表扫描。你在这里做的事情也可以被认为是'pivoting'或'cross-tab',这取决于你使用哪个数据库可以有更高效的工作方式。 – Twelfth