Допустим, у нас есть две таблицы: 'Car' и 'Part', с соединительной таблицей в 'Car_Part'.Скажем, я хочу видеть все машины, в которых есть деталь 123.Я мог бы сделать это:
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. Я должен также сказать, что в действительности я хочу выбрать на основе Идентификатор детали, Тип детали и, возможно, другие вещи.Итак, запрос, который я хочу сделать, на самом деле выглядит так:
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))