假设我有一些表,其中的列名为 *_FOO:
create table a(x number, x_foo number);
create table b(z_foo number);
如何查询 USER_TAB_COLS 来获取 (a) 同时存在 X 和 X_FOO 的列列表,
select table_name, short_col, foo_col from ... user_tab_cols ...
TABLE_NAME SHORT_COL FOO_COL
---------- --------- -------
A X X_FOO
和 (b) 没有对应 X 的 X_FOO 列表?
TABLE_NAME FOO_COL
---------- -------
B Z_FOO
这个问题是 Oracle 特有的,因为查询将使用 USER_TAB_COLS,但我认为查询连接将是通用 SQL?
最佳答案
对于第一个,基于串联的简单连接即可:
select utc1.table_name, utc1.column_name, utc2.column_name
from user_tab_columns utc1
join user_tab_columns utc2
on utc2.table_name = utc1.table_name
and utc2.column_name = utc1.column_name || '_FOO';
TABLE_NAME COLUMN_NAME COLUMN_NAME
------------------------------ ------------------------------ ------------------------------
A X X_FOO
对于第二个,您可以从名为 '%_FOO'
的任何内容开始,并检查名称较短的列是否不存在:
select utc1.table_name, utc1.column_name
from user_tab_columns utc1
where utc1.column_name like '%\_FOO' escape '\'
and not exists (
select null
from user_tab_columns utc2
where utc2.table_name = utc1.table_name
and utc2.column_name = substr(utc1.column_name, 1, length(utc1.column_name) -4)
);
TABLE_NAME COLUMN_NAME
------------------------------ ------------------------------
B Z_FOO
或者,如果您愿意,也可以使用外部联接:
select utc2.table_name, utc2.column_name
from user_tab_columns utc1
right outer join user_tab_columns utc2
on utc2.table_name = utc1.table_name
and utc2.column_name = utc1.column_name || '_FOO'
where utc2.column_name like '%\_FOO' escape '\'
and utc1.column_name is null;
TABLE_NAME COLUMN_NAME
------------------------------ ------------------------------
B Z_FOO
SQL Fiddle有两个外连接示例。
关于sql - 查找包含 X 列和 X_FOO 列的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33572564/