【问题标题】: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% 列而不是整个表

【问题讨论】:

  • 添加一些示例表数据和预期结果 - 以及格式化文本。

标签: sql oracle


【解决方案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$

【讨论】:

    猜你喜欢
    • 2012-07-04
    • 2014-05-25
    • 2020-12-23
    • 2019-11-25
    • 2014-03-23
    • 2022-01-17
    相关资源
    最近更新 更多