如何使用SQL专门提取区域标记

时间:2017-03-01 14:37:16

标签: sql tsql

我有一个数据库,其中有一个名为CNSMR_ACCNT_TAG的表。此表格中有多个cnsmr_accnts,其中包含通过tag_id标识的相关标签。该表通过tag_id链接到Tag表。 Tag表通过tag_typ链接到tag_typ_id表。所以......

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

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

我需要获取大量关于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

1 个答案:

答案 0 :(得分:0)

您是否尝试过使用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 here的方式,有一个很棒的(非常详细的)解释。

如果每个tag_id只能返回一个区域,那么这可能就是诀窍。而不是选择以前的JOIN结果集的全部,然后将其连接到您的外部查询,这将只为每个消费者帐户提取子查询的第一行,我猜测这是你'正在寻找。如果我错了,我会提前道歉:)