如何删除嵌套的select语句

时间:2009-10-27 12:26:03

标签: sql sql-server sql-server-2008

我有一个包含列的名称表 填充NameID 名称 TYPEID

使用以下SQL

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

我被要求将其转换为内部连接而不使用任何嵌套选择但不确定如何。 谢谢你的帮助!

3 个答案:

答案 0 :(得分:1)

最初我认为你根本不需要加入,

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

我同意Lukas的观点,我不确定告诉你改变这种情况的人为什么认为内部联接会比原来更好。

答案 1 :(得分:0)

您可以通过以下方式删除嵌套部分: -

  

声明@NameID int

     

选择@NameID =(SELECT MIN([NameID])   FROM [Name] WHERE [Name] ='Billy'AND   [TYPEID] = @ TYPEID)

     

SELECT [NameID] FROM [Name] WHERE [TypeID]   = @TypeID AND NameID> = @NameID

但是如前所述,这并没有提供任何性能优势,因为子查询只会在您的版本中进行一次评估,与此相同。

答案 2 :(得分:-2)

好吧,看起来只是移动条件[Name]='Billy'应该为此特定查询产生相同的结果。所以转换你的原文:

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

为:

SELECT[NameID]
FROM[Name]
WHERE[TypeID] = @TypeID
AND[Name]='Billy'