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如何在後臺處理這兩個選擇?
我知道一些關於執行計劃,在這種情況下,兩個計劃都顯示了2個表掃描和一個嵌套循環(內部連接),查詢成本爲18%。此外,當使用b.audit_key = a.audit_key條件時,它將首先匹配所有audit_keys(1,2,3),然後在a.audit_key = 2上過濾結尾。不過,我有興趣知道其中的差異,因爲我僅在audit_key上對其進行過濾。 – Ash
因此,看到不同的執行計劃會讓你感到困惑,因爲這會告訴你不同之處。 – Leonidas199x
我想知道,如果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