2017-04-20 17 views
1

我有一個有趣的和具有挑戰性的問題來解決。左加入到另一張表和同一張表,以檢查成員存在與否導致它中斷

我有3列名,ID,父(母是自引用到同一個表)表X和這個有100萬條記錄,無父記錄(與父列的所有記錄爲空)

我還有另一個與父列一樣的具有相同結構的臨時表(階段)。

現在,我想將這個階段插入到原始tableX中,但是在此之前執行與它自己的左連接,並且這與Y檢查是否存在任何成員(以避免重複插入)。下面的select查詢輸出被插入到另一個表中,所以我避免粘貼它。

這裏是我的查詢:

有2萬條記錄測試和SSMS不斷爲3小時以上運行時,這是一個永無止境的查詢。

我需要有人來請這一點,並幫我合適的答案,或者可能是最好的方式重寫只要條件滿足這個查詢

+0

我看不出有什麼毛病查詢本身,EXCE點你可能沒有使用任何指數。你有任何連接列上的索引嗎? –

+0

沒有Tim我不能在自引用列上使用索引,這會在插入過程中遇到性能問題。糾正我,如果我錯了。 – user2114880

+0

你不能兩面都有。你打算多久插一次還是多次查詢? –

回答

0

使用EXISTS,它停止:

SELECT stg1.code, stg1.id, stg1.parent 
FROM Stage stg1 
where exists (
    select 1 
    from TableX dm 
    where stgl.[Parent] = dm.Code 
    AND dm.Status_ID = 1 -- Active 
    AND dm.Version_ID = @Version_ID 
    ) 
and exists (
    select 1 
    from Stage dm2 -- Same stage table as above 
    where stgl.[Parent] = dm2.Code 
    ) 
+0

這是最快的答覆約翰,讓我快速執行1000萬條記錄並查看。 – user2114880

0
所有的

首先嚐試從TableX的其他表如下得到記錄,然後使用INNER該表中加入

DECLARE @tblX AS Table 
(
    Code VARCHAR(50) 
) 

INSERT INTO @tblX 
SELECT 
    Code 
FROM TableX 
WHERE [email protected]_ID 
AND Status_ID=1 

SELECT stgl.code, stgl.id, stgl.parent 
FROM Stage stgl 
INNER JOIN @tblX dm -- First see if the member already exists 
ON stgl.[Parent] = dm.Code 
INNER JOIN Stage dm2 -- Same stage table as above 
ON dm.Code = dm2.Code 
+0

謝謝Sandip,我之前嘗試過,並沒有成功。你以這種方式嘗試過嗎? – user2114880

+0

我已經嘗試了過去,並給予更好的表現,然後在條件加入,我沒有你的數據,所以我現在還沒有測試 –

+0

好點sandip,爲了他人的利益我會給一些示例數據快速如何產生百萬條記錄。我將編輯我的問題,謝謝指出。 – user2114880