我正在尝试使用重复的列名来查找表链接。说我有以下表格
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。是否有用于获取上述内容的脚本?
答案 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
表示表格t1
与t2
一起使用prod_id
(cust_id
和prod_num
在输入中,因此无需他们在输出上)
demo - 它是SQL Server,但是JOIN
也可以在DB2中运行;)