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
结果集,然后将其连接到外部查询,不如将每个消费者帐户的子查询的第一行拉开,我猜是您想要的。如果我错了,我提前道歉:)