我想查找名称为%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%列而不是整个表格
答案 0 :(得分: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%';
答案 1 :(得分:0)
你可以使用"存在"条款
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%')
答案 2 :(得分:0)
请记住,某些对象(表,列)可能具有用双引号定义的名称;与全部大写字符串相比,这些条件会被错过。如果它对您的问题很重要,请记住这一点。
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$