sql - 查找包含 X 列和 X_FOO 列的表

标签 sql oracle

假设我有一些表,其中的列名为 *_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/

相关文章:

php - MySQL,如何按类别排序?

sql - select 和 delete 语句中的 PostgreSQL 变量

mysql - linux 中用于处理数据库(oracle、mysql)的最佳 Gui 编辑器?

oracle - 无法在Grails中创建池问题的初始连接

oracle - 使用 Oracle 数据库的 JOIN 语法更新

mysql - 在 PL SQL 中验证数据库级别的列

javascript - 发布数据而不刷新+调用另一个jquery函数

sql - 在 Postgres 中从多行到单列

SQL面试题

sql - 如何在 WHERE 子句中使用临时列名?