2015-04-03 119 views
0

主要Table_1DB2 SQL:改变连接查询提供所需的结果

ID ROLE    CODE 
______________________________ 
1  DIRECTOR   CD1 
1  PRODUCER   CD2 
1  ACTOR    CD10 
2  PRODUCER   CD5 
2  ACTOR    CD11 
2  DIRECTOR   CD8 
2  SPOT_BOY   CD97 
3  ACTOR    CD12 
3  DIRECTOR   CD41 
______________________________ 

参考Table_2

COL_NAME  REF_VALUE 
____________________________ 
DIRECTOR  DIR 
PRODUCER  PROD 
ACTOR  ACT 
SPOT_BOY  SPB 
____________________________ 

ROLETable_1Table_2

参考Table_3COL_NAME柱联接:

select 
    a.id, a.role, b.ref_value, c.code, c.name 
from 
    table_1 a, table_2 b, table_3 c 
where 
    a.id = 1 
    and a.role = b.col_name 
    and a.code = c.code 

结果:的

CODE  NAME 
_________________________ 
CD1  ONE 
CD2  TWO 
CD5  FIVE 
CD10  TEN 
CD11  ELEVEN 
CD12  TWELVE 
CD97  NINETY_SEVEN 
CD8  EIGHT 
CD41  FORTY_ONE 
_________________________ 

CODE柱,Table_3

查询CODE柱联接

ID ROLE  REF_VALUE CODE  NAME 
___________________________________________ 
1 DIRECTOR DIR   CD1  ONE 
1 PRODUCER PROD  CD2  TWO 
1 ACTOR  ACT   CD10  TEN 
___________________________________________ 

在不修改任何的三个表,我想修改上面的查询如下:每当ROLETable_1PRODUCER(或在Table_2REF_VALUEPROD),相应的从Table_1CODE(或CODETable_3)和NAMETable_3应该被视为其的ROLEDIRECTORID

即用于ID 1所述的修改的查询应该导致:

ID ROLE  REF_VALUE CODE  NAME 
___________________________________________ 
1 DIRECTOR DIR   CD1  ONE 
1 PRODUCER PROD  CD1  ONE 
1 ACTOR  ACT   CD10  TEN 
___________________________________________ 

ID 2所述的修改的查询应该导致:

ID ROLE  REF_VALUE CODE  NAME 
_____________________________________________________ 
2 PRODUCER PROD  CD8  EIGHT 
2 ACTOR  ACT   CD11  ELEVEN 
2 DIRECTOR DIR   CD8  EIGHT 
2 SPOT_BOY SPB   CD97  NINETY_SEVEN 
_____________________________________________________ 

换句话说,与上面给出的表结构(和没有选择修改表中的结构或数据),我想要一个查询,其中给定任何ID,CODENAME值角色PRODDIR应该是对应于该ID的角色DIR的值。

我正在使用DB2数据库。

感谢您的阅读!

+0

1)感觉应该使用'Table_2.col_name'值切换'Table_1.role'值。 2)这是否应该永久切换(即更新数据库)? – 2015-04-04 23:35:58

+0

@ Clockwork-Muse:不..我不允许更新数据库...检查您的解决方案.. – Nik 2015-04-05 02:50:04

回答

0

这是非常简单的一个额外的连接。这是最简单的一个子查询或CTE来包装这件事,虽然:

WITH PrdDir AS (SELECT Df.id, Df.role, COALESCE(Ot.code, Df.code) AS code 
       FROM Table_1 Df 
       LEFT JOIN Table_1 Ot 
         ON Ot. id = Df.id 
          AND Df.role = 'PRODUCER' 
          AND Ot.role = 'DIRECTOR') 

SELECT PrdDir.id, PrdDir.role, Table_2.ref_value, Table_3.code, Table_3.name 
FROM PrdDir 
JOIN Table_2 
    ON Table_2.col_name = PrdDir.role 
JOIN Table_3 
    ON Table_3.code = PrdDir.code 

SQL Fiddle Example

请不要使用隐式连接语法(逗号分隔FROM条款) - 一件事,你不能在DB2中使用LEFT JOIN s - 在这个查询中,如果没有director,至少生产者仍然会被返回。对于另一个人来说,忘记一个条件很容易,偶然得到一个笛卡尔产品。