2017-03-17 83 views
1

的名稱列的表我想找到喜歡%ABC%的名稱,但不包括表名的所有表:那有像%USER%名稱的任何列S查找包含stringA所有表,但不包括與像stringB

我嘗試用DBA_TAB_COLUMNS加入DBA_TABLES作爲

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%列的表名不應該在所有返回的,因此增加

AND DTC.COLUMN_NAME NOT LIKE '%USER%' 

不咕因爲它只會過濾掉列%USER%而不是整個表格

+0

添加一些示例表格數據和預期結果 - 以及格式化文本。 – jarlh

回答

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%'; 
+0

小記:我會使用DBA_ALL_TABLES搜索真正的所有表。 DBA_TABLES不包含對象表。 – Rusty

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%') 
+0

謝謝扎克,工作,給雪茄戈登Linoff誰是幾分鐘快,道歉 – HenrikJson

+0

哈哈沒問題。戈登顯然比我更快。很高興它的工作 – Zach

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$ 
相關問題