我的问题与this SO question重复,但我想为DB2
数据库执行此操作,而其他问题则要求SQL Server
。
我在架构TABLE1
中有两个表TABLE2
和BP
。我希望找到这两个表之间共享的列的名称。
DB Server上有许多架构,
我没有看到任何适用于所有类型的数据库的通用答案。
答案 0 :(得分:1)
我办公室的DB2 DBA告诉我这个,它给了我正确的结果,
SELECT BP.BP_COL FROM
(SELECT COLNAME AS BP_COL FROM SYSCAT.COLUMNS WHERE TABNAME='TABLE1' AND TABSCHEMA='BP' ) BP1
INNER JOIN
(SELECT COLNAME AS AR_COL FROM SYSCAT.COLUMNS WHERE TABNAME='TABLE2' AND TABSCHEMA='BP' ) BP2
ON BP1.BP_COL=BP2.AR_COL
WITH UR;
答案 1 :(得分:1)
我不确定为什么@SabirKhan答案有这么多的子查询 - 只需将元信息加入到自身中 - 内部联接将确保您从两个表中获得结果。
SELECT A.COLNAME AS DUP
FROM SYSCAT.COLUMNS A
JOIN SYSCAT.COLUMNS B ON A.COLNAME = B.COLNAME AND B.TABNAME='TABLE2' AND B.TABSCHEMA='BP'
WHERE A.TABNAME='TABLE1' AND A.TABSCHEMA='BP'
至于您没有看到适用于所有数据库平台的答案。你是对的 - 没有这样的答案 - 数据库平台变化很大。
答案 2 :(得分:0)
FWiW:不仅仅是名称的有效INTERSECT,下面还显示了无与伦比的名称;合格的SYSCOLUMNS或类似的目录VIEW的规范以及相应的列名可能特定于DB2变体,因此可能需要进行调整,但是使用IBM DB2 for i 7.1 SQL,以下内容是成功的,如图所示:
设定:
create table bp.TABLE1 (in_both char, common char, only_in_t1 char )
;
create table bp.TABLE2 ( only_in_t2 char, in_both char, common char)
;
查询列:
SELECT t1_col, t2_col
from ( select char( column_name, 25) as t1_col
from syscolumns
where table_name = 'TABLE1' and table_schema='BP' ) as t1
full outer join
( select char( column_name, 25) as t2_col
from syscolumns
where table_name = 'TABLE2' and table_schema='BP' ) as t2
on t1_col = t2_col
; -- report from above query, with headings, follows [where a dash indicates NULL value]:
T1_COL T2_COL
IN_BOTH IN_BOTH
COMMON COMMON
ONLY_IN_T1 -
- ONLY_IN_T2