【发布时间】: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