【问题标题】:Recursive SQL command and duplicate results?递归 SQL 命令和重复结果?
【发布时间】:2014-06-24 11:14:58
【问题描述】:

我想知道如何使用DISTINCT 处理删除重复结果是否是处理递归调用的最佳方式。这是我的代码示例:

with cte as(
SELECT
dbo.Users.Username,
dbo.Contacts.FirstName,
dbo.Contacts.LastName,
tenant.Name,
tenant.Id,
tenant.ParentTenantId
FROM
dbo.Tenants AS tenant
INNER JOIN dbo.Users ON tenant.Id = dbo.Users.TenantId
INNER JOIN dbo.Contacts ON dbo.Users.ContactId = dbo.Contacts.Id
where tenant.Id = '6CD4C969-C794-4C95-9CA2-5984AEC0E32C'

union all

SELECT 
dbo.Users.Username,
dbo.Contacts.FirstName,
dbo.Contacts.LastName,
childTenant.Name,
childTenant.Id,
childTenant.ParentTenantId
FROM
dbo.Tenants AS childTenant
INNER JOIN dbo.Users ON childTenant.Id = dbo.Users.TenantId
INNER JOIN dbo.Contacts ON dbo.Users.ContactId = dbo.Contacts.Id
INNER JOIN cte on childTenant.ParentTenantId  = cte.Id)

select DISTINCT UserName, FirstName, LastName, Name, Id, ParentTenantId  from cte ORDER BY Id

结果如下:

这是不使用DISTINCT 关键字的结果

虽然DISTINCT 有效,但我想知道这是否是处理重复结果的最佳方法,或者我是否应该以某种方式重新处理我的查询。

【问题讨论】:

  • 你返回了多少条记录?如果它相对较少,请不要担心,只需区分它们即可。
  • 我想不到 100k。
  • 在其中一个联接表中,联接列必须有重复的行。如果您对此表执行 DISTINCT 或修改连接以获取不同的行,那么您将操作数据的较小子集,从而提高性能。
  • @JosephB,我认为 INNER JOIN dbo.Users ON tenant.Id = dbo.Users.TenantId 的加入可能会导致它,因为对于每个返回的父级,它也会带回每次都是孩子。

标签: sql sql-server recursion sql-server-2012


【解决方案1】:

我不确定这里是否是这种情况,但一个常见的误解是 distinct 是适用于某个列的函数。区别适用于行,即:

select distinct(x), y from t

等同于:

select distinct x, y from tselect distinct x, (y) from t

此外:

select x, distinct(y) from t

是一个无效的结构

【讨论】:

  • 你是对的。括号不应该在那里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-07
  • 2012-11-10
  • 2017-09-11
  • 1970-01-01
  • 2011-01-02
  • 1970-01-01
相关资源
最近更新 更多