假設我們有兩個表格:'Car'和'Part',並在'Car_Part'中加入一個表格。假設我想查看其中有123部分的所有汽車。我可以這樣做:哪一個更快:加入GROUP BY或子查詢?
SELECT Car.Col1, Car.Col2, Car.Col3
FROM Car
INNER JOIN Car_Part ON Car_Part.Car_Id = Car.Car_Id
WHERE Car_Part.Part_Id = @part_to_look_for
GROUP BY Car.Col1, Car.Col2, Car.Col3
或者我能做到這一點
SELECT Car.Col1, Car.Col2, Car.Col3
FROM Car
WHERE Car.Car_Id IN (SELECT Car_Id FROM Car_Part WHERE Part_Id = @part_to_look_for)
現在,一切都在我想用第一種方法,因爲我一直好父母誰在我灌輸長大清教徒對子查詢的憎恨和對集合論的熱愛,但是有人向我建議,做這麼大的GROUP BY比子查詢更糟糕。
我應該指出,我們在SQL Server 2008上。我也應該說,實際上我想根據零件ID,零件類型和其他可能的情況來選擇。所以,我想真正做的查詢看起來是這樣的:
SELECT Car.Col1, Car.Col2, Car.Col3
FROM Car
INNER JOIN Car_Part ON Car_Part.Car_Id = Car.Car_Id
INNER JOIN Part ON Part.Part_Id = Car_Part.Part_Id
WHERE (@part_Id IS NULL OR Car_Part.Part_Id = @part_Id)
AND (@part_type IS NULL OR Part.Part_Type = @part_type)
GROUP BY Car.Col1, Car.Col2, Car.Col3
或者......
SELECT Car.Col1, Car.Col2, Car.Col3
FROM Car
WHERE (@part_Id IS NULL OR Car.Car_Id IN (
SELECT Car_Id
FROM Car_Part
WHERE Part_Id = @part_Id))
AND (@part_type IS NULL OR Car.Car_Id IN (
SELECT Car_Id
FROM Car_Part
INNER JOIN Part ON Part.Part_Id = Car_Part.Part_Id
WHERE Part.Part_Type = @part_type))
你跑了嗎?看着查詢計劃?基準? – Oded 2010-07-01 08:27:58
我不得不生成大量的數據,所以我不會在下個星期之前瞭解它。當我搜索答案時,我沒有找到答案,所以值得在網上發佈一個可能正在尋找的人的問題。 – d4nt 2010-07-01 08:31:00
Group By是勞動密集型的,用於計算像平均數,總和等東西。您似乎使用它來消除重複項。嘗試DISTINCT沒有羣組... – Alocyte 2017-11-23 14:14:27