查找所有包含字符串的表,不包括名称为字符串的表
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$
【讨论】:
以上是关于查找所有包含字符串的表,不包括名称为字符串的表的主要内容,如果未能解决你的问题,请参考以下文章