如何将联接转换为嵌套选择?

时间:2019-01-25 13:41:30

标签: sql join select

我有一个简单的联接,我想用嵌套的选择查询替换它。

SELECT AspNetRoles.Name
      ,AspNetUserRoles.UserId
      ,AspNetUserRoles.RoleId
FROM AspNetRoles 
INNER JOIN AspNetUserRoles 
    ON AspNetRoles.Id = AspNetUserRoles.RoleId

这可能吗?该怎么做?

2 个答案:

答案 0 :(得分:2)

  

这可能吗?

我实际上要使用:如所呈现的那样,您似乎希望数据来自两个表,它们的行是相关的。这就是JOIN的目的。如果您想将其表示形式转换为使用诸如IN,EXISTS或选择列表中的子选择项之类的协调子查询,则只会使其难以阅读(供以后的开发人员维护),或者无法返回您想要的所有数据。

内部,数据库很可能将以相同的方式计划和执行查询,因此,从JOIN方法出发并没有太大的误解。 (Microsoft)投入了大量精力来确定查询请求的数据以及访问该数据的最佳策略。无论如何,这通常都会涉及一定量的重写查询,因此在直觉上追求一种特定的书写方式会更好是没有意义的。通常,您应该尽可能简单地编写查询,让数据库中的优化器将其找出来,如果做得不好,则开始进行更改以使其更好。您在这里提出的内容可能是所有查询中最简单的;以1:M的关系连接两个表之间的连接,并且只要索引有意义,并且数据统计信息是最新的,就无法以某种可怕的方式重写它,就无法改善其性能。优化器选择的策略

如果您在问题中添加更多信息以说明为什么要使用此功能,我们可以为您提供更多帮助。您实质上已经表明您认为存在性能问题,但是我想您还没有说出您正在运行的实际查询是什么(我怀疑这实际上是SELECT * FROM a JOIN b ON a.id = b.id),所以如果您需要帮助,将其发布

答案 1 :(得分:0)

编辑:这是一个内部联接,而不是ANSI-89样式的ANSI-92

您可以

SELECT        
    AspNetRoles.Name,
    AspNetUserRoles.UserId,
    AspNetUserRoles.RoleId
FROM            
    AspNetRoles, AspNetUserRoles
WHERE
    AspNetUserRoles.Id = (
        SELECT
            id
        FROM
            AspNetRoles
        WHERE
            AspNetRoles.id = AspNetUserRoles.id
)

但是没有意义,我为编写它感到羞耻,它比使用join或inline where慢