如何从此SQL语句中删除嵌套选择

时间:2009-10-23 07:53:44

标签: sql tsql sql-server-2008

我有以下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 个答案:

答案 0 :(得分:4)

您的查询不正确,因为您使用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 :(得分:1)

嵌套选择比连接慢的那些长寿神话之一。它完全取决于嵌套选择所说的内容。 SQL只是一种声明性语言,可以告诉您想要做什么,数据库会将其转换为完全不同的东西。 MSSQL和Oracle(以及我怀疑其他主要引擎)都能完美地将相关子查询和嵌套视图转换为连接(如果它是有益的)(除非你做的事情非常复杂,如果可能的话,很难用正常情况来描述)联接。

答案 2 :(得分:0)

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:不要使用“*”。这也会提高性能。 :)