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

У меня есть следующий SQL:

SELECT * FROM Name 
INNER JOIN ( SELECT 2 AS item, NameInAddress.NameID as itemID, NameInAddress.AddressID
        FROM NameInAddress
        INNER JOIN Address ON Address.AddressID = NameInAddress.AddressID
        WHERE (Address.Country != 'UK')
) AS Items ON (Items.itemID = Name .Name ID)

Меня попросили удалить вложенный выбор и использовать вместо него INNER JOINS, поскольку это улучшит производительность, но я изо всех сил.

Использование SQL Server 2008

Может кто-нибудь помочь?

Спасибо!

Ответы [ 3 ]

4 голосов
/ 23 октября 2009

Ваш запрос неверен, так как вы используете Items.itemID, пока он не находится в подвыборке

Полагаю, это то, что вы имели в виду:

SELECT Name.*
FROM Name
INNER JOIN NameInAddress
ON Name.NameID = NameInAddress.NameID
INNER JOIN Address 
ON Address.AddressID = NameInAddress.AddressID
WHERE (Address.Country != 'UK')

РЕДАКТИРОВАТЬ: точный перевод вашего запроса начнется с SELECT Name.*, 2 as Item, NameInAddress.NameID, NameInAddress.AddressID хотя

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

Это один из тех долгоживущих мифов, которые вложенные выборки медленнее, чем объединения. Это полностью зависит от того, что говорит вложенный выбор. SQL - это просто декларативный язык, чтобы сказать, что вы хотите сделать, база данных превратит его в совершенно разные вещи. И MSSQL, и Oracle (и я подозреваю, что и другие основные механизмы) прекрасно способны преобразовывать коррелированные подзапросы и вложенные представления в объединения, если это выгодно (если только вы не делаете действительно сложные вещи, которые было бы очень сложно, если возможно, описать обычным присоединяется.

0 голосов
/ 23 октября 2009
SELECT     2 AS Item, * 
FROM       Name 
INNER JOIN NameInAddress
ON         Name.NameID = NameInAddress.NameID
INNER JOIN Address 
ON         Address.AddressID = NameInAddress.AddressID
WHERE      Address.Country != 'UK'

PS: не используйте "*". Это также увеличит производительность. :)

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