使用子查询优化SQL查询

时间:2018-04-20 16:30:23

标签: sql sql-server

我有一张包含地址和组织名称的表格。有些情况下,相同的地址可以与多个组织相关联,以及其他存在同一个地址 - 组织对的多个记录的实例。即:

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

我怀疑不是将子查询放在内存中并将其视为外部查询的表,而是使用嵌套循环并为表中的每条记录重新运行子查询。我没有足够的经验知道如何防止这种情况发生。

1 个答案:

答案 0 :(得分:4)

我认为将查询编写为:

更容易
select address,
       (case when min(orgname) = max(orgname) then min(orgname)
             else 'Multiple'
        end) as orgname
from t
group by address;