使用SQL专门提取区域标签



i有一个数据库,该数据库的表格为CNSMR_ACCNT_TAG。该表具有许多cnsmr_accnts,其中包含通过tag_id标识的关联标签。该表通过tag_id链接到标签表。标签表通过tag_typ_id链接到tag_typ表。所以...

Select * from cnsmr_accnt_tag cat inner join tag t on cat.tag_id = t.tag_id inner join tag_typ tt on t.tag_typ_id = tt.tag_typ_id

有多种类型的标签,其中一些标签是独家的 - 例如,消费者帐户只能一次在一个区域中,但可能在几个任务中。因此,您将具有一个活动区域标签,但可能有1个或几个任务标签。

我需要获取有关cnsmr_accnt的一堆数据,包括它在哪个区域。

我一直在做的是与一个子查询进行查询以返回该区域。这种方法的缺点是有很多帐户,并且将所有cnsmr_accnts的区域恢复为缓慢。有没有更好的方法来编写这样的查询,以便我为每个帐户带回区域?

我正在运行的查询基本上如下:

Select distinct
REPLACE(LTRIM(REPLACE(cnsmr_accnt_idntfr_lgcy_txt, '0', ' ')), ' ', '0') as ACCNT_NUMBER
,AREA
,[wrkgrp_nm]
,wrkgrp_shrt_nm
,other_fields_here
from cnsmr c 
inner join cnsmr_accnt ca 
on c.cnsmr_id = ca.cnsmr_id inner join wrkgrp w on c.wrkgrp_id = w.wrkgrp_id inner join cnsmr_accnt_tag cat 
on ca.cnsmr_accnt_id = cat.cnsmr_accnt_id 
inner join tag t 
on cat.tag_id = t.tag_id 
inner  join tag_typ tt 
on t.tag_typ_id = tt.tag_typ_id
inner join 
(select cnsmr_accnt_id, tag_nm as AREA from tag t inner join tag_typ tt
on t.tag_typ_id = tt.tag_typ_id 
inner join cnsmr_accnt_tag cat on
t.tag_id = cat.tag_id 
where
tag_typ_shrt_nm = 'AREA'
and cnsmr_accnt_sft_delete_flg = 'N') as AREA_TAG on 
cat.cnsmr_accnt_id = AREA_TAG.cnsmr_accnt_id

您是否尝试过为此使用CROSS APPLY?我希望我不要混淆您的语法...您可以尝试一下:

SELECT DISTINCT
     REPLACE(LTRIM(REPLACE(cnsmr_accnt_idntfr_lgcy_txt, '0', ' ')), ' ', '0') AS ACCNT_NUMBER
    ,T.AREA
    ,[wrkgrp_nm]
    ,wrkgrp_shrt_nm
    ,other_fields_here
FROM cnsmr c 
INNER JOIN cnsmr_accnt ca 
    ON c.cnsmr_id = ca.cnsmr_id 
INNER JOIN wrkgrp w 
    ON c.wrkgrp_id = w.wrkgrp_id 
INNER JOIN cnsmr_accnt_tag cat 
    ON ca.cnsmr_accnt_id = cat.cnsmr_accnt_id 
INNER JOIN tag t 
    ON cat.tag_id = t.tag_id 
INNER JOIN tag_typ tt 
    ON t.tag_typ_id = tt.tag_typ_id
CROSS APPLY
(
    SELECT TOP 1
         cnsmr_accnt_id
        ,tag_nm as AREA
    FROM tag t 
    INNER JOIN tag_typ tt
        ON t.tag_typ_id = tt.tag_typ_id 
    INNER JOIN cnsmr_accnt_tag cat 
        ON t.tag_id = cat.tag_id 
    WHERE cat.cnsmr_accnt_id = AREA_TAG.cnsmr_accnt_id
    AND tag_typ_shrt_nm = 'AREA'
    AND cnsmr_accnt_sft_delete_flg = 'N'
) T
;

有一个很棒的(非常详细的)说明CROSS APPLY有时在此处表现均超过INNER JOIN

如果每个tag_id只能返回一个区域,那么这可能会解决问题。与其选择以前的JOIN结果集,然后将其连接到外部查询,不如将每个消费者帐户的子查询的第一行拉开,我猜是您想要的。如果我错了,我提前道歉:)

最新更新