查找所有包含字符串的表,不包括名称为字符串的表

Posted

技术标签:

【中文标题】查找所有包含字符串的表,不包括名称为字符串的表【英文标题】:Find all tables containing stringA, excluding tables having columns with a name like stringB 【发布时间】:2017-03-17 13:52:43 【问题描述】:

我想查找名称为 %ABC% 但不包括 table_name:s 的所有表,其中包含任何名称为 %USER% 的列

我尝试将 dba_tables 与 dba_tab_columns 加入为

SELECT DT.OWNER, DT.TABLE_NAME
  FROM DBA_TABLES DT
       INNER JOIN DBA_TAB_COLUMNS DTC
          ON DT.TABLE_NAME = DTC.TABLE_NAME AND DT.OWNER = DTC.OWNER
 WHERE DT.TABLE_NAME LIKE '%ABC%'

如果表有像 %USER% 这样的列,则根本不应该返回 table_name,所以添加

AND DTC.COLUMN_NAME NOT LIKE '%USER%'

不好,因为它只会过滤掉 %USER% 列而不是整个表

【问题讨论】:

添加一些示例表数据和预期结果 - 以及格式化文本。 【参考方案1】:

您不需要join,因为表名在列表中。只是一个聚合

SELECT DTC.OWNER, DTC.TABLE_NAME
FROM DBA_TAB_COLUMNS DTC
WHERE DTC.TABLE_NAME LIKE '%ABC%'
GROUP BY DTC.OWNER, DTC.TABLE_NAME
HAVING SUM(CASE WHEN DTC.COLUMN_NAME LIKE '%USER%' THEN 1 ELSE 0 END) = 0;

如果要使用两个表,请使用NOT EXISTS

SELECT DT.OWNER, DT.TABLE_NAME
FROM DBA_TABLES DT
WHERE NOT EXISTS (SELECT 1
                  FROM DBA_TAB_COLUMNS DTC
                  WHERE DT.TABLE_NAME = DTC.TABLE_NAME AND
                        DT.OWNER = DTC.OWNER AND
                        DTC.COLUMN_NAME LIKE '%USER%'
                 ) AND
      DT.TABLE_NAME LIKE '%ABC%';

【讨论】:

小记:我会使用 DBA_ALL_TABLES 搜索真正的所有表。 DBA_TABLES 不包括对象表。【参考方案2】:

你可以使用“exists”子句

SELECT DT.OWNER, DT.TABLE_NAME
FROM DBA_TABLES DT
WHERE DT.TABLE_NAME LIKE '%ABC%'
AND NOT EXISTS ( SELECT 'y' FROM DBA_TAB_COLUMNS DTC 
               where DT.TABLE_NAME = DTC.TABLE_NAME 
               and DT.OWNER = DTC.OWNER
               and DTC.COLUMN_NAME like '%USER%')

【讨论】:

感谢 Zach,辛苦了,把雪茄给了快几分钟的 Gordon Linoff,道歉 哈哈没问题。 Gordon 打字的速度显然比我快。很高兴它成功了【参考方案3】:

请记住,某些对象(表、列)的名称可能用双引号定义;与全大写字符串相比,这些条件将被忽略。如果它对您的问题很重要,请记住这一点。

select dt.owner, dt.table_name
from   dba_tables dt
where  dt.table_name like '%ABC%'
  and  (dt.owner, dt.table_name) not in 
       ( select owner, table_name
         from   dba_tab_columns
         where  column_name like '%USER%'
       )
;

OWNER   TABLE_NAME
------  ------------------
SYSTEM  LOGMNR_TABCOMPART$
XDB     XDB$XTABCOLS
SYS     TABCOMPART$
SYS     LOGMNRG_TABCOMPART$

【讨论】:

以上是关于查找所有包含字符串的表,不包括名称为字符串的表的主要内容,如果未能解决你的问题,请参考以下文章

怎么查找数据库所有表里面包含的某个文字

查找名称包含字符串的所有文件[关闭]

js对象属性的命名规则

sql匹配另一张表,匹配不到返回原值

XPath 表达式查找标签名称包含“名称”的元素

linux中按照指定内容查找文件