Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 WHERE ID IN....  [new]
maxterbear
Member

Откуда:
Сообщений: 221
Правда ли, что при использовании запросов

SELECT * FROM Table1 WHERE ID IN (Select CompanyID FROM Table2)


запрос Select CompanyID FROM Table2 выполняется для каждой строки SELECT * FROM Table1 WHERE ID IN?
то есть использовать такие запросы это моветон...
24 фев 12, 13:46    [12146690]     Ответить | Цитировать Сообщить модератору
 Re: WHERE ID IN....  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
maxterbear
Правда ли, что при использовании запросов

SELECT * FROM Table1 WHERE ID IN (Select CompanyID FROM Table2)


запрос Select CompanyID FROM Table2 выполняется для каждой строки SELECT * FROM Table1 WHERE ID IN?
то есть использовать такие запросы это моветон...
В план.
24 фев 12, 13:46    [12146694]     Ответить | Цитировать Сообщить модератору
 Re: WHERE ID IN....  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
В данном случае на 99.99% команда будет "переписана" оптимизатором как нормальный INNER JOIN, никакой "дурацкой" работы не случится. А вообще, как отметил предыдущий оратор, глянуть в студии план исполнения все-равно впятеро быстрее чем писать даже такой ничтожный по объему текста вопрос.
26 фев 12, 21:00    [12153815]     Ответить | Цитировать Сообщить модератору
 Re: WHERE ID IN....  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
SamMan
В данном случае на 99.99% команда будет "переписана" оптимизатором как нормальный INNER JOIN, никакой "дурацкой" работы не случится. А вообще, как отметил предыдущий оратор, глянуть в студии план исполнения все-равно впятеро быстрее чем писать даже такой ничтожный по объему текста вопрос.
IN и INNER JOIN эквивалентны?
Однако!

А ничего, что результаты получаются разные?
26 фев 12, 21:20    [12153863]     Ответить | Цитировать Сообщить модератору
 Re: WHERE ID IN....  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
iap
А ничего, что результаты получаются разные?


У меня - одинаковые, к примеру:
USE AdventureWorks2008R2
GO
SELECT * FROM HumanResources.Department WHERE DepartmentID IN (SELECT BusinessEntityID FROM Person.BusinessEntity)
SELECT * FROM HumanResources.Department INNER JOIN Person.BusinessEntity ON DepartmentID=BusinessEntityID


Планы, что характерно, тоже одинаковы байт-в-байт.
Альтернативного примера впопыхах (надо выключать форум - завтра на работу :( ) не придумалось.
Однако с благодарностью взгляну на ваш. Но уже завтра. :)
26 фев 12, 22:03    [12153953]     Ответить | Цитировать Сообщить модератору
 Re: WHERE ID IN....  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
SamMan,

если по IN будут повторятся ID - то результаты IN и JOIN будут различаться
26 фев 12, 22:05    [12153959]     Ответить | Цитировать Сообщить модератору
 Re: WHERE ID IN....  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
P.S. A! Или вы про число колонок в резалт-сете? Ну это-то понятно. Я ж концептуально, и по планам, опять же...
26 фев 12, 22:05    [12153960]     Ответить | Цитировать Сообщить модератору
 Re: WHERE ID IN....  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
locky
если по IN будут повторятся ID - то результаты IN и JOIN будут различаться


Верно. Но приводимый ТС пример из первого мессаджа как бэ намекает, что ключевые колонки участвующие "в спектакле" - именно ключевые (PK).
26 фев 12, 22:08    [12153965]     Ответить | Цитировать Сообщить модератору
 Re: WHERE ID IN....  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
SamMan
locky
если по IN будут повторятся ID - то результаты IN и JOIN будут различаться


Верно. Но приводимый ТС пример из первого мессаджа как бэ намекает, что ключевые колонки участвующие "в спектакле" - именно ключевые (PK).

Мне так не кажется, если честно....
26 фев 12, 22:11    [12153974]     Ответить | Цитировать Сообщить модератору
 Re: WHERE ID IN....  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
locky
SamMan
пропущено...


Верно. Но приводимый ТС пример из первого мессаджа как бэ намекает, что ключевые колонки участвующие "в спектакле" - именно ключевые (PK).

Мне так не кажется, если честно....


По правилам "сетевого этикета" (нигде, впрочем, не опубликованного, так что можно и не соглашаться) если имя колонки заканчивается на ID (а уж тем более если эти 2 буквы и есть все имя) И дополнительных пояснений автор поста не приводит, то назначение такой колонки - быть IDentity. Т.е. однозначно определять каждую строку таблицы.
27 фев 12, 14:14    [12157047]     Ответить | Цитировать Сообщить модератору
 Re: WHERE ID IN....  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
SamMan
locky
пропущено...

Мне так не кажется, если честно....


По правилам "сетевого этикета" (нигде, впрочем, не опубликованного, так что можно и не соглашаться) если имя колонки заканчивается на ID (а уж тем более если эти 2 буквы и есть все имя) И дополнительных пояснений автор поста не приводит, то назначение такой колонки - быть IDentity. Т.е. однозначно определять каждую строку таблицы.
CompanyID никак не коррелирует с Table2.
Может, в Table2 PK называется ID, а CompanyID - это ссылка на таблицу Company или Table1?
Возможных вариантов - 100500 штук
27 фев 12, 15:50    [12157957]     Ответить | Цитировать Сообщить модератору
 Re: WHERE ID IN....  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
iap
Может, в Table2 PK называется ID, а CompanyID - это ссылка на таблицу Company или Table1?


Ну в общем-то и ID, строго говоря, не коррелирует с Table1, это ж не Table1ID. В общем без скрипта создания обоих таблиц вариаций масса. Я выбрал тот что мне показался наиболее вероятным. А правильным может быть любой. Для того, собственно, и "Рекомендации по оформлению" придумали что бы такие неоднозначности убрать, а отвечающим - не гадать.
27 фев 12, 17:45    [12159268]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить