我有一张包含地址和组织名称的表格。有些情况下,相同的地址可以与多个组织相关联,以及其他存在同一个地址 - 组织对的多个记录的实例。即:
Address Orgname
Address1 Orgname1
Address2 Orgname2
Address2 Orgname2
Address3 Orgname3
Address3 Orgname4
我想运行一个select查询,为每个地址输出1行,如果有1:1地址:Orgname关系,那么orgname,否则单词' Multiple'。即:
Address Orgname
Address1 Orgname1
Address2 Orgname2
Address3 Multiple
我写了以下内容来完成此任务,但它运行得非常慢,我想知道如何优化它。子查询X返回不同的匹配地址:Orgname。子查询Y计算剩余并返回存在1:多关系的地址。这些都是自己跑得快。然后外部查询返回原始表并返回不同的地址和Orgname,如果地址不在具有1:多关系的地址的子查询中,或者“多个'如果是。
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
我怀疑不是将子查询放在内存中并将其视为外部查询的表,而是使用嵌套循环并为表中的每条记录重新运行子查询。我没有足够的经验知道如何防止这种情况发生。
答案 0 :(得分:4)
我认为将查询编写为:
更容易select address,
(case when min(orgname) = max(orgname) then min(orgname)
else 'Multiple'
end) as orgname
from t
group by address;