DB2 SQL:更改连接查询以提供所需的结果

DB2 SQL: altering join query to provide required result

主要Table_1:

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
____________________________
Table_1

ROLE 列与 Table_2

COL_NAME 列相连接

引用Table_3:

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

CODE 列与 Table_3

CODE 列相连接

查询:

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 

结果:

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

在不修改三个 table 中的任何一个的情况下,我想修改上面的查询,以便:每当 Table_1 中的 ROLEPRODUCER(或 REF_VALUETable_2中是PROD),对应的CODE来自Table_1(或CODE来自Table_3)和NAME 来自 Table_3 应该被视为 ROLE DIRECTOR 因为 ID.

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
_____________________________________________________

换句话说,对于上面给定的 table 结构(并且没有修改 table 中的结构或数据的选项),我想要一个查询,其中给定任何 ID,角色 PRODDIRCODENAME 值应该是对应于 ID 的角色 DIR 的值。

我正在使用 DB2 数据库。

感谢阅读!

这非常简单,只需添加一个连接即可。不过,将其包装在子查询或 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 JOINs - 在此query,如果没有director,至少producer还是会被退回。另一方面,很容易忘记条件,并意外得到笛卡尔积。