2017-10-18 121 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