如何删除嵌套查询语句

问题描述:

我与列 填充NameID 名称 TYPEID如何删除嵌套查询语句

用下面的SQL名称表

SELECT[NameID] 
FROM[Name] 
WHERE[TypeID] = @TypeID 
AND NameID >= (SELECT MIN([NameID]) 
       FROM [Name] 
       WHERE [Name]='Billy' AND [TypeID][email protected]) 

我一直要求将其转换为内部连接,而不使用任何嵌套的选择,但不知道如何。 感谢您的帮助!

+2

子查询evaulated只有一次(它不是一个相关子查询)。它不应该是一个性能问题。我认为编写查询的其他方式效率会更低。 – 2009-10-27 12:36:05

+0

这是一个练习吗?为什么它被认为需要重写? – 2009-10-27 12:38:53

+0

Hi Lukas, 我刚刚被要求从我们的SQL脚本中删除嵌套选择,我没有足够的SQL背景来反驳为什么我不应该这样做,因此发布在这里。 – Gribbler 2009-10-27 12:46:52

本来我没想到你需要加入所有,

;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; 

我与卢卡斯同意,我不知道为什么,是谁告诉你要改变人认为这个内部联接会比原来的更好。

+0

不是等价的,原始查询将返回比Name ='Billy'更多的行。 – 2009-10-27 12:34:33

+0

是的,我想了解原始查询的目的。 – 2009-10-27 12:39:04

+0

由于性能方面的原因,我被要求做这件事,我被告知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' 
+0

那些评价答案(或者其他答案)的人会如此友善地指出逻辑错误和/或不回答问题的地方?干杯。 – van 2009-10-28 11:02:11

+0

我测试了这个。 如果我有一个表 填充NameID TYPEID名称 ------ ------ ---- 1 1比利 2约翰一书 3 1比利 4 1比利 – Gribbler 2009-10-28 12:39:14

+0

然后嵌套查询返回1作为值(当@TypeID为1时) 查询然后返回ID的1,2,3,4(即比利斯和约翰) 而您的查询只返回1,3,4(比利斯) – Gribbler 2009-10-28 12:41:16