как удалить вложенный оператор выбора - PullRequest
0 голосов
/ 27 октября 2009

у меня есть таблица имен с колонками NameID название TypeID

Со следующим SQL

SELECT[NameID]
FROM[Name]
WHERE[TypeID] = @TypeID
AND NameID >= (SELECT MIN([NameID]) 
               FROM [Name] 
               WHERE [Name]='Billy' AND [TypeID]=@TypeID)   

Меня попросили преобразовать это во внутреннее объединение без использования вложенного выбора, но я не знал, как это сделать. спасибо за помощь!

Ответы [ 3 ]

1 голос
/ 27 октября 2009

Первоначально я не думал, что вам вообще нужно объединение,

;WITH n AS 
(
    SELECT
      NameID,
      rn = ROW_NUMBER() OVER (ORDER BY NameID)
    FROM [Name]
    WHERE TypeID = @TypeID
    AND [Name] = 'Billy'
)
SELECT NameID
    FROM n
    WHERE rn > 1;

Опять же, может быть, у меня нет четких требований. Какова цель этого запроса?

SELECT n1.NameID 
FROM [Name] AS n1
    INNER JOIN
(
    SELECT NameID = MIN(NameID) 
    FROM [Name]
    WHERE TypeID = @TypeID
    AND [Name] = 'Billy'
) AS n2
ON n1.NameID >= n2.NameID
WHERE n1.TypeID = @TypeID;

Я согласен с Лукасом, я не уверен, почему человек, который говорит вам изменить это, думает, что внутреннее соединение будет лучше, чем ваш оригинал.

0 голосов
/ 27 октября 2009

Что ж, похоже, простое перемещение условия [Name]='Billy' должно дать тот же результат для этого конкретного запроса. Так что конвертируйте свой оригинал:

SELECT[NameID]
FROM[Name]
WHERE[TypeID] = @TypeID
AND NameID >= (SELECT MIN([NameID]) 
                   FROM [Name] 
                   WHERE [Name]='Billy' AND [TypeID]=@TypeID)

до:

SELECT[NameID]
FROM[Name]
WHERE[TypeID] = @TypeID
AND[Name]='Billy'
0 голосов
/ 27 октября 2009

Вы можете удалить вложенную часть с помощью: -

объявлять @NameID int

select @NameID = (ВЫБРАТЬ МИН. ([NameID]) ОТ [Имя] ГДЕ [Имя] = 'Билли' И [TypeID] = @ TypeID)

ВЫБРАТЬ [NameID] ОТ [Name] ГДЕ [TypeID] = @TypeID AND NameID> = @ NameID

Но, как уже говорилось, это не дает какого-либо выигрыша в производительности, поскольку подзапрос будет оцениваться только один раз в вашей версии, так же, как в этой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...