假设我们有两个表格:'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