SQL在没有外键的情况下跨表查找链接列

时间:2017-11-30 20:41:38

标签: sql db2

我正在尝试使用重复的列名来查找表链接。说我有以下表格

T1:

| Prod_ID | Cust_Id | Value |
| P1      | C1      | 1     |
| P2      | C2      | 2     |
| P3      | C3      | 3     |
| P4      | C4      | 4     |
| P5      | C5      | 5     |

T2:

| Prod_ID | Prod_Num |
| P1      | PN1      |
| P2      | PN2      |
| P3      | PN3      |
| P4      | PN4      |
| P5      | PN5      |

我依靠系统表来获取表信息。数据看起来像

| tabname | colname  |
| T1      | Prod_ID  |
| T1      | Cust_Id  |
| T1      | Value    |
| T2      | Prod_ID  |
| T2      | Prod_Num |
| T3      | ....     |

如果我想查找列 Prod_ID Cust_ID 的所有表格,我可以使用

SELECT tabname, count(*)
FROM syscat.columns
WHERE colname IN ('Prod_ID', 'Cust_Id') 
GROUP BY tabname
HAVING count(*) > 1

现在,当我想知道如何链接表中的两列时,查询变得越来越复杂。

例如:要查找如何链接 Cust_Id Prod_Num ,预期输出将类似于

| tabname | colname  |
| T1      | Cust_id  |
| T1      | Prod_id  |
| T2      | Prod_id  |
| T2      | Prod_Num |

建议Prod_Id包含在两个表中,并可用于映射Cust_Id和Prod_num。是否有用于获取上述内容的脚本?

1 个答案:

答案 0 :(得分:1)

我会使用自联接。

SELECT c1.tabname, c2.colname joinCol, c3.tabname
FROM syscat.columns c1
JOIN syscat.columns c2 ON c1.tabname = c2.tabname
JOIN syscat.columns c3 ON c3.tabname != c2.tabname and c3.colname = c2.colname
JOIN syscat.columns c4 ON c4.tabname = c3.tabname and c3.colname = c2.colname
WHERE c1.colname = 'Cust_Id' and c4.colname = 'Prod_Num'

输出如下:

tabname joinCol  tabname
---------------------------
T1      Prod_id  T2

表示表格t1t2一起使用prod_idcust_idprod_num在输入中,因此无需他们在输出上)

demo - 它是SQL Server,但是JOIN也可以在DB2中运行;)