2017-03-01 9 views
-1

私はCNSMR_ACCNT_TAGというテーブルを持つデータベースを持っています。このテーブルはの番号を持ち、関連するタグはtag_idによって識別されます。このテーブルはtag_idによってタグテーブルにリンクされています。タグテーブルはtag_typ_idによってtag_typテーブルにリンクされています。だから... ...具体的には、SQLを使用してエリアタグを抽出する

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つの領域にあることができるが、いくつかのタスクであってもよいです。 1つのアクティブエリアタグがありますが、潜在的に1つまたは複数のタスクタグがあります。私はそれがでますどの領域を含むcnsmr_accntに関するデータの束を取得する必要があります。

私がやっている何を

は面積を返すサブクエリを持つクエリを持つことです。このアプローチの欠点は、多くのアカウントがあり、ALL 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

は、このための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 JOINhereをアウトパフォームすることができる方法の素晴らしい(と非常に詳細な)説明があります。

各tag_idが1つの領域だけを返すことができる場合、これは単にトリックを行うかもしれません。これまでのJOIN結果セットの全体を選択して外部クエリに接続するのではなく、各コンシューマアカウントのサブクエリの最初の行だけを取得します。私が間違っていた場合は、事前にお詫び申し上げます。

関連する問題