首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何删除嵌套的select语句

问如何删除嵌套的select语句
EN

Stack Overflow用户
提问于 2009-10-27 20:26:03
回答 3查看 1.2K关注 0票数 0

我有一个名称表,其中包含列NameID Name TypeID

使用以下SQL

代码语言:javascript
复制
SELECT[NameID]
FROM[Name]
WHERE[TypeID] = @TypeID
AND NameID >= (SELECT MIN([NameID]) 
               FROM [Name] 
               WHERE [Name]='Billy' AND [TypeID]=@TypeID)   

我被要求在不使用任何嵌套select的情况下将其转换为内连接,但不确定如何转换。谢谢你的帮忙!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-10-27 20:32:03

一开始我觉得你根本不需要加入,

代码语言:javascript
复制
;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;

再说一次,也许我没有明确的需求。这个查询的目的是什么?

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2009-10-27 21:15:01

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

声明@NameID整型

select @NameID = (SELECT MIN(NameID) FROM Name WHERE Name='Billy‘AND TypeID=@TypeID)

从名称中选择NameID,其中TypeID =@类型AND,NameID >= @名称AND

但如前所述,这不会提供任何性能优势,因为子查询在您的版本中只会被评估一次,与下面的版本相同。

票数 0
EN

Stack Overflow用户

发布于 2009-10-27 21:35:22

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

代码语言:javascript
复制
SELECT[NameID]
FROM[Name]
WHERE[TypeID] = @TypeID
AND NameID >= (SELECT MIN([NameID]) 
                   FROM [Name] 
                   WHERE [Name]='Billy' AND [TypeID]=@TypeID)

至:

代码语言:javascript
复制
SELECT[NameID]
FROM[Name]
WHERE[TypeID] = @TypeID
AND[Name]='Billy'
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1630461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档