如何从特定数据库中的所有表中检索不属于主键和外键的所有列

Posted

技术标签:

【中文标题】如何从特定数据库中的所有表中检索不属于主键和外键的所有列【英文标题】:How to retrieve all the columns from all of the tables in a particular database which are not part of primary keys and foreign keys 【发布时间】:2015-11-20 09:07:27 【问题描述】:

我是 *** 的新手,如有任何错误,我深表歉意。

我正在开发 Qlikview。它不允许在两个不同的表中具有相同名称的列。每次需要从 oracle 导入表时,我都会为每一列创建别名。现在我想处理大型数据库。所以我决定创建一个过程,将所有非约束列作为输入,并在表名中附加列名。

我已经编写了一个具有基本知识的 sql 查询,它现在返回主列,但是当访问外键时不起作用(它检索具有外键的列)

我的查询如下

SELECT C.table_name,
        C.column_name
FROM user_constraints a,
  user_cons_columns b,
  ALL_TAB_COLUMNS C
WHERE a.OWNER          =b.owner
AND a.OWNER            =C.owner
AND C.COLUMN_NAME      !=b.COLUMN_NAME
AND a.CONSTRAINT_NAME  =b.CONSTRAINT_NAME
AND a.table_name       =b.table_name
AND a.table_name       =C.table_name
AND a.constraint_type IN('P','R')
AND a.table_name NOT LIKE 'BIN%'
AND A.TABLE_NAME NOT LIKE 'DEF%'
AND b.table_name NOT LIKE 'BIN%'
AND b.TABLE_NAME NOT LIKE 'DEF%'
AND C.table_name NOT LIKE 'BIN%'
AND C.TABLE_NAME NOT LIKE 'DEF%';

任何建议将不胜感激

谢谢

【问题讨论】:

【参考方案1】:

这应该为您提供给定 schema_name 的所有表中的所有列,其中这些列不是主键或外键的一部分

SELECT  atc.owner,
    atc.table_name,
    atc.column_name 
FROM
    all_tab_columns atc
WHERE
    NOT EXISTS
    (
        SELECT  acc.owner,
            acc.table_name,
            acc.column_name
        FROM
            all_cons_columns acc
        LEFT
        JOIN    all_constraints ac ON acc.owner = ac.owner AND ac.constraint_name = acc.constraint_name AND ac.constraint_type IN ('P', 'R')
        WHERE
            atc.owner = atc.owner
        AND acc.table_name = atc.table_name
        AND acc.column_name = atc.column_name
    )
AND atc.owner = 'YOUR_SCHEMA_NAME'
ORDER
BY  1, 2
/

【讨论】:

以上是关于如何从特定数据库中的所有表中检索不属于主键和外键的所有列的主要内容,如果未能解决你的问题,请参考以下文章

主键和外键的作用

数据库表中的主键能不能修改?

SQL中主键和外键的定义是啥???

如何匹配主键和外键的值?

主键和外键的作用

主键和外键的区别: