2017-08-30 79 views
0

我想了解加入條件和加入子查詢之間的區別。加入條件和加入子查詢之間的區別(過濾器)

在SQL Server中,

CREATE TABLE #tab1 
(audit_key int 
,name varchar(20) 
) 

INSERT INTO #tab1 VALUES(1,'Rich') 
INSERT INTO #tab1 VALUES(1,'Rodes') 
INSERT INTO #tab1 VALUES(2,'Rich') 
INSERT INTO #tab1 VALUES(2,'Rodes') 
INSERT INTO #tab1 VALUES(3,'Rich') 
INSERT INTO #tab1 VALUES(3,'Rodes') 

SELECT a.audit_key,a.name,b.name 
FROM #tab1 a 
JOIN #tab1 b ON b.name='Rodes' AND b.audit_key=2 
WHERE a.name='Rich' AND a.audit_key=2 

SELECT a.audit_key,a.name,b.name 
FROM #tab1 a 
JOIN (SELECT audit_key,name FROM #tab1 WHERE audit_key=2 AND name='Rodes') b ON 1=1 
WHERE a.name='Rich' AND a.audit_key=2 

drop table #tab1 

在上面的腳本中,第一選擇會發生什麼? 它會過濾基於b.name ='Rodes'和b.audit_key = 2的記錄,然後將它與'tab1 a'記錄相加嗎?

1st select和2nd select之間有區別嗎?

SQL Server如何在後臺處理這兩個選擇?

回答

0

如果你看執行計劃,他們在後臺處理完全相同。如果你不熟悉的執行計劃,這裏是一些資源:

https://www.red-gate.com/simple-talk/sql/performance/execution-plan-basics/

可能只是我,而是先寫入的方式似乎很奇怪,我通常會寫這樣的:

SELECT a.audit_key,a.name,b.name 
FROM #tab1 a 
JOIN #tab1 b ON b.name=a.name AND b.audit_key=a.audit_key 
WHERE a.name='Rich' AND a.audit_key=2 

因爲在你的情況下,你加入了所有的事情,實際上是製作相同的派生表,因爲你在連接中指定了標準。上面的代碼與兩個匹配,然後where指定你在找什麼。

+0

我知道一些關於執行計劃,在這種情況下,兩個計劃都顯示了2個表掃描和一個嵌套循環(內部連接),查詢成本爲18%。此外,當使用b.audit_key = a.audit_key條件時,它將首先匹配所有audit_keys(1,2,3),然後在a.audit_key = 2上過濾結尾。不過,我有興趣知道其中的差異,因爲我僅在audit_key上對其進行過濾。 – Ash

+0

因此,看到不同的執行計劃會讓你感到困惑,因爲這會告訴你不同之處。 – Leonidas199x

+0

我想知道,如果SQL Server對待'JOIN(選擇audit_key,名稱從#tab1 WHERE audit_key = 2並且名稱='Rodes')b ON 1 = 1'和'JOIN#tab1 b ON b.name ='Rodes 'AND b.audit_key = 2'相同,或者是否有任何區別 – Ash