我有一个数据库,其中有一个名为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
答案 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
结果集的全部,然后将其连接到您的外部查询,这将只为每个消费者帐户提取子查询的第一行,我猜测这是你'正在寻找。如果我错了,我会提前道歉:)