2016-03-01 80 views
1

我需要從主外部查詢中的Application表中選擇一列,這意味着我必須重寫以下查詢才能使用連接而不是子查詢來移動應用程序表進入主外部查詢的範圍。將包含子查詢的T-SQL查詢重寫爲使用連接

SELECT XMLValue 
FROM DynamicField 
WHERE ParentID IN (
    SELECT DynamicFieldID 
    FROM DynamicField 
    WHERE ParentID IN (
     SELECT DynamicFieldID 
     FROM Application 
    ) 
    ) 

有沒有人有關於如何解決這個問題的建議?

+0

你可以添加樣本數據,對每個表,並預期輸出。如果您需要一些幫助,FAQ對於[製作示例數據](http://stackoverflow.com/help/mcve)有很好的指導。 –

+0

而不是使用連接,你可能想看看WHERE EXISTS。我不認爲連接會執行這個技巧,因爲這可能會返回多行。 – Tom

回答

2

因此,像這樣:

SELECT s.* 
FROM DynamicField t 
INNER JOIN DynamicField t1 on(t.parentID = t1.DynamicFieldID) 
INNER JOIN Application s ON(t1.parentID = s.DynamicFieldID) 

這將選擇所有的應用程序表。

1

如果我們不包括表中的結果集,我們最好把它放在where exists部分,而不要包含在連接中。

SELECT XMLValue, app.[your application column name] 
 
FROM DynamicField mainouter 
 
join application app on exists(
 
select 1 from DynamicField appfriend 
 
where app.DynamicFieldID = appfriend.ParentID 
 
and appfriend..DynamicFieldID = mainouter.parentID 
 
)

+0

儘管此解決方案提供的結果與@Yossi建議的結果相同,但執行時間大約是其執行時間的10倍(所涉及的查詢只是更廣泛的一小部分)。 – Simon