2015-04-03 61 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,至少生產者仍然會被返回。對於另一個人來說,忘記一個條件很容易,偶然得到一個笛卡爾產品。