如何删除嵌套查询语句
我与列 填充NameID 名称 TYPEID如何删除嵌套查询语句
用下面的SQL名称表
SELECT[NameID]
FROM[Name]
WHERE[TypeID] = @TypeID
AND NameID >= (SELECT MIN([NameID])
FROM [Name]
WHERE [Name]='Billy' AND [TypeID][email protected])
我一直要求将其转换为内部连接,而不使用任何嵌套的选择,但不知道如何。 感谢您的帮助!
本来我没想到你需要加入所有,
;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;
我与卢卡斯同意,我不知道为什么,是谁告诉你要改变人认为这个内部联接会比原来的更好。
不是等价的,原始查询将返回比Name ='Billy'更多的行。 – 2009-10-27 12:34:33
是的,我想了解原始查询的目的。 – 2009-10-27 12:39:04
由于性能方面的原因,我被要求做这件事,我被告知Iner Join速度更快。 – Gribbler 2009-10-27 12:44:26
你可以通过删除嵌套部分: -
DECLARE @NameID INT
选择@NameID =(SELECT MIN([填充NameID]) 来自[NAME] WHERE [名称] =”比利” AND [TYPEID] = @ TYPEID)
SELECT [填充NameID] FROM [名称] WHERE [TYPEID] = @TypeID AND填充NameID> = @NameID
但如前所述,这不会提供任何性能优势,因为子查询只会在您的版本中评估一次,与此相同。
好吧,它看起来像移动条件[Name]='Billy'
应该产生相同的结果为这个特定的查询。所以,将您原创】
SELECT[NameID]
FROM[Name]
WHERE[TypeID] = @TypeID
AND NameID >= (SELECT MIN([NameID])
FROM [Name]
WHERE [Name]='Billy' AND [TypeID][email protected])
到:
SELECT[NameID]
FROM[Name]
WHERE[TypeID] = @TypeID
AND[Name]='Billy'
子查询evaulated只有一次(它不是一个相关子查询)。它不应该是一个性能问题。我认为编写查询的其他方式效率会更低。 – 2009-10-27 12:36:05
这是一个练习吗?为什么它被认为需要重写? – 2009-10-27 12:38:53
Hi Lukas, 我刚刚被要求从我们的SQL脚本中删除嵌套选择,我没有足够的SQL背景来反驳为什么我不应该这样做,因此发布在这里。 – Gribbler 2009-10-27 12:46:52