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
中的 ROLE
是 PRODUCER
(或 REF_VALUE
在Table_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
,角色 PROD
和 DIR
的 CODE
和 NAME
值应该是对应于 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
请不要使用隐式连接语法(逗号分隔的 FROM
子句)- 一方面,您不能在 DB2 中使用它 LEFT JOIN
s - 在此query,如果没有director,至少producer还是会被退回。另一方面,很容易忘记条件,并意外得到笛卡尔积。
主要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
中的 ROLE
是 PRODUCER
(或 REF_VALUE
在Table_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
,角色 PROD
和 DIR
的 CODE
和 NAME
值应该是对应于 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
请不要使用隐式连接语法(逗号分隔的 FROM
子句)- 一方面,您不能在 DB2 中使用它 LEFT JOIN
s - 在此query,如果没有director,至少producer还是会被退回。另一方面,很容易忘记条件,并意外得到笛卡尔积。