查找包含stringA的所有表,不包括具有类似stringB的列的表

时间:2017-03-17 13:52:43

标签: sql oracle

我想查找名称为%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%列而不是整个表格

3 个答案:

答案 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$