我有一个简单的联接,我想用嵌套的选择查询替换它。
SELECT AspNetRoles.Name
,AspNetUserRoles.UserId
,AspNetUserRoles.RoleId
FROM AspNetRoles
INNER JOIN AspNetUserRoles
ON AspNetRoles.Id = AspNetUserRoles.RoleId
这可能吗?该怎么做?
答案 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慢