2015-12-18 55 views
0

我正試圖用新標準重寫遺留連接語法。如何重寫遺留連接語法* =在SQL Server中

SELECT count(*) 
FROM es_dbo.tablTypes t 
    ,es_dbo.tablReg r 
    ,es_dbo.tabl_PRGandCLI p 
WHERE t.ClientType *= r.ClientType 
    AND p.ID IN (
     SELECT DISTINCT ClientID 
     FROM esinet_dbo.tablReG 
     ) 
    AND t.ClientType IN (@intClientType) 

這是我正在嘗試。

SELECT count(*) 
FROM es_dbo.tablTypes t 
LEFT JOIN es_dbo.tablReg r ON t.ClientType = r.ClientType 
LEFT JOIN es_dbo.tabl_PRGandCLI p ON p.ID IN (
     SELECT DISTINCT ClientID 
     FROM es_dbo.tablReG 
     ) 

我收到的記錄相同的,我是否使用LEFT JOIN或內部查詢的第二部分JOIN。誰能解釋

+0

你得到相同的記錄,因爲這是那裏的數據意味着什麼區別。我認爲你的重寫應該是內部連接,而不是剩下的,我不認爲你需要子查詢 –

+0

我不確定是否應該在INNER JOIN或LEFT JOIN中使用es_dbo.tabl_PRGandCLI。沒有加入條件 –

+0

如果沒有加入條件,那麼我認爲這是一個交叉 –

回答

0

嘗試以下操作:

SELECT count(*) 
FROM es_dbo.tablTypes t 
    left join es_dbo.tablReg r on t.ClientType = r.ClientType 
WHERE t.ClientType IN (@intClientType) 
    EXISTS (SELECT 1 FROM esinet_dbo.tablReG p WHERE r.ClientID = p.ID) 

1) 我以爲@intClientType是一個標值,所以沒有必要在

2)刪除DISTINCT和子查詢爲您檢查存在。 EXISTS應該更快,因爲它涉及找到第一個元素,而不是對DISTINCT進行一些排序。

3)* =被替換爲LEFT JOIN,基於here的討論。

+0

原始查詢選擇多列。我剛剛用COUNT(*)替換以查看結果。沒有參數值,查詢返回超過1億條記錄。 –

+0

好的,我已經更新了相應的建議查詢替換 – Alexei

0

這既不是內部聯接,也沒有留下根據查詢似乎加入像交叉連接,所以你可以使用下面的查詢:

SELECT count(*) 
FROM es_dbo.tablTypes t 
LEFT JOIN es_dbo.tablReg r ON t.ClientType = r.ClientType, 
es_dbo.tabl_PRGandCLI p WHERE p.ID IN (
    SELECT DISTINCT ClientID 
    FROM es_dbo.tablReG 
    )