我有以下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
有人可以帮忙吗?
谢谢!
答案 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:不要使用“*”。这也会提高性能。 :)