创建显示标记层次结构的帐户视图

时间:2015-06-26 14:01:11

标签: sql join hierarchy

我们的数据库结构如下:

Cnsmr_accnt_tag表

Cnsmr_accnt_id      | Tag_id
12345               | 614
12345               | 615
12345               | 741
12345               | 989
12345               | 901
12352               | 614
12352               | 675
12352               | 314
12352               | 989
12370               | 789
12370               | 412
13270               | 142
13270               | 326
13270               | 391
13270               | 469

然后我们有标签表

Tag_ID    | Tag_typ_ID  
614       | 800
615       | 801
741       | 802
989       | 803
675       | 801
789       | 800
412       | 801
142       | 802
314       | 802
326       | 807
391       | 802
901       | 805
469       | 804

最后我们有了Tag_typ表

Tag_typ_id     | Tag_typ_shrt_nm
800            | Area
801            | Process
802            | Other1
803            | Other2
804            | Other3
805            | Other4
806            | Other5
807            | Other6

cnsmr_accnt可以有多个标签。区域和流程标记是独占的,帐户只能包含其中一个。但是其他类型的标签是非排他性的,并且帐户可以具有许多这些标签。

我正在尝试创建一个查询来显示数据,如下所示:

CNSMR_ACCNT_ID       |AREA_TAG  | PROCESS TAG  | OTHER TAGS
12345                |614       |   615        | 741
12345                |614       |   615        | 989
12345                |614       |   615        | 901
12352                |614       |   675        | 314
12352                |614       |   675        | 989
12370                |789       |   412        | 142
12370                |789       |   412        | 326
12370                |789       |   412        | 391
12370                |789       |   412        | 469

有关如何执行此操作的任何建议吗?

1 个答案:

答案 0 :(得分:0)

您可以使用左连接的查询,如下所示:

SELECT * 
FROM   cnsmr_accnt_tag c 
   LEFT JOIN (tag ta 
              LEFT JOIN tag_type tta 
                     ON tta.tag_typ_id = ta.tag_typ_id) 
          ON c.tag_id = ta.tag_id 
             AND tta.tag_typ_shrt_nm = 'PROCESS' 
   LEFT JOIN (tag tb 
              LEFT JOIN tag_type ttb 
                     ON ttb.tag_typ_id = tb.tag_typ_id) 
          ON c.tag_id = tb.tag_id 
             AND ttb.tag_typ_shrt_nm = 'AREA' 
   LEFT JOIN (tag tc 
              LEFT JOIN tag_type ttc 
                     ON ttc.tag_typ_id = tc.tag_typ_id) 
          ON c.tag_id = tc.tag_id 
             AND ttc.tag_typ_shrt_nm NOT IN ( 'AREA', 'PROCESS' )