Во время написания процедуры я столкнулся с ситуацией, когда мне нужно было ввести DISTINCT
в запрос.Это несколько похоже на мою схему таблиц
CREATE TABLE T1
(
ID INT,
TypeID INT,
SubTypeID INT,
Name VARCHAR(50)
);
GO
CREATE TABLE T2
(
TypeID INT,
SubTypeID INT,
TypeName VARCHAR(50)
);
GO
INSERT INTO T2 (TypeID, SubTypeID, TypeName)
VALUES (1, 1, 'AAA'), (1, 2, 'AAA'),
(2, 1, 'BBB'), (2, 2, 'BBB'),
(3, 1, 'CCC'), (3, 2, 'CCC');
INSERT INTO T1 (ID, TypeID, SubTypeID, Name)
VALUES (1, 1, 1, 'ABC'), (2, 2, 2, 'BCD'),
(3, 3, 2, 'CDE'), (4, 1, 1, 'DEF'),
(5, 2, 2, 'EFG'), (6, 3, 0, 'FGH'); -- Sub Type not detected yet.
GO
. В этом случае любой пользователь может предоставить SubType
или разрешить системе обнаруживать.
Теперь у меня есть 2 варианта запроса для этого сценария.
Вариант 1
SELECT DISTINCT t1.ID, t1.Name, t2.TypeName
FROM T1
JOIN T2 ON T1.TypeID = T2.TypeID;
И Вариант 2
SELECT t1.ID, t1.Name, t2.TypeName
FROM T1
JOIN (SELECT DISTINCT TypeID, TypeName FROM T2) AS T2 ON T1.TypeID = T2.TypeID;
Результат одинаков в обоих случаях, но я хочу знать, какой из них предпочтительнее.В таблице T1 могут быть миллионы строк и тысячи строк в T2.
По моему мнению, я должен использовать первый вариант, чтобы избежать подзапроса.
Но все же хочу подтвердить это сообществом, поскольку оно может оказать некоторое или существенное влияние на производительность, которое пока неизвестно.