【发布时间】:2018-04-20 16:30:23
【问题描述】:
我有一个包含地址和组织名称的表格。在某些情况下,同一地址可以与多个组织相关联,而在其他情况下,同一地址-组织对有多个记录。也就是说:
Address Orgname
Address1 Orgname1
Address2 Orgname2
Address2 Orgname2
Address3 Orgname3
Address3 Orgname4
我想运行一个选择查询,它为每个地址输出 1 行,如果存在 1:1 地址:组织名称关系,则为组织名称,否则为“多个”一词。也就是说:
Address Orgname
Address1 Orgname1
Address2 Orgname2
Address3 Multiple
我编写了以下代码来完成此操作,但运行速度非常慢,我想知道如何优化它。子查询 X 返回不同的匹配地址:组织名称。子查询 Y 计算剩余并返回存在 1:many 关系的地址。它们自己跑得很快。然后,外部查询返回原始表,如果地址不在具有 1:many 关系的地址的子查询中,则返回不同的 Address 和 Orgname,如果是,则返回“Multiple”。
SELECT DISTINCT [Match Address],
CASE WHEN [Match Address] in
(SELECT y.[Match Address] from
(SELECT x.[Match Address], count(x.ORGNAME) as [Count] from
(SELECT DISTINCT [Match Address], ORGNAME
FROM Table) x
GROUP BY [Match Address]
HAVING count(x.ORGNAME) > 1) y)
THEN 'Multiple' ELSE ORGNAME END as ORGNAME
FROM Table
我怀疑不是将子查询放在内存中并将其视为外部查询的表,而是使用嵌套循环并为表中的每条记录重新运行子查询。我只是没有足够的经验知道如何防止这种情况发生。
【问题讨论】:
-
执行计划显示什么?
-
仅供参考,您可能会更幸运地在dba.stackexchange.com 上发布此内容。
标签: sql sql-server