簡體   English   中英

如何一張一張地獲取一個用戶擁有但不屬於其他用戶的所有表

[英]How to get all tables owned by one user but not by others, one by one

當兩個用戶都擁有一個同名的表時,假設兩個用戶擁有同一個表。

在我的 Oracle 數據庫中,我有 N 個名為 MAIN、USR_1、USR_2、...、USR_N 的用戶。 用戶 MAIN 擁有其他用戶擁有的所有表。 但是,它可能有一個 USR_1 擁有但 USR_2 沒有的表,或者 USR_2048 擁有而 USR_1024 沒有,等等。

我想進行查詢以檢索 MAIN 用戶所有但不屬於某個用戶的所有表。 事實上,我想一一檢查,比如:

獲取用戶 MAIN 擁有的所有表並將其與 USR_1 進行比較,獲取用戶 MAIN 擁有的所有表並將其與 USR_2 進行比較,...獲取用戶 MAIN 擁有的所有表並將其與 USR_N 進行比較,

並返回由 MAIN 包含但不由該特定用戶包含的表名。

我試過兩者都做:

SELECT TABLE_NAME
  FROM DBA_TABLES
 WHERE OWNER LIKE 'MAIN'
   AND TABLE_NAME NOT IN (SELECT TABLE_NAME
                            FROM DBA_TABLES
                           WHERE OWNER LIKE '%USR_%');
SELECT TABLE_NAME
  FROM DBA_TABLES
 WHERE OWNER LIKE 'MAIN'
   AND TABLE_NAME NOT IN (SELECT TABLE_NAME
                            FROM DBA_TABLES
                           WHERE OWNER LIKE '%USR_%'
                           GROUP BY OWNER, TABLE_NAME);

我理解為什么第一個語句不起作用,但我認為可以使用第二個語句。 我怎樣才能讓它成為可能?

我會這樣做:

SELECT m.TABLE_NAME, usr_count, owner_list
  FROM DBA_TABLES m
LEFT JOIN (SELECT TABLE_NAME, count(*) as usr_count, listagg(OWNER, ',') within group (order by OWNER) as owner_list
             FROM DBA_TABLES
            WHERE OWNER LIKE 'USR_%'
            GROUP BY TABLE_NAME) usr
ON m.TABLE_NAME = usr.TABLE_NAME
 WHERE m.OWNER LIKE 'MAIN'
  -- hide tables that everyone has
  AND coalesce(usr_count,0) < (select count(*) from ALL_USERS where USERNAME like 'USR_%') 
;

編輯:實際上,如果您想要一個沒有每個表的 USR_% 用戶的列表,反加入可能會更好。

SELECT m.TABLE_NAME, listagg(USERNAME, ',') within group (order by USERNAME) as usr_missing_table
  FROM DBA_TABLES m
JOIN ALL_USERS a
  ON a.USERNAME like 'USR_%'
LEFT JOIN DBA_TABLES usr
  ON a.USERNAME = usr.OWNER
  AND m.TABLE_NAME = usr.TABLE_NAME
WHERE m.OWNER LIKE 'MAIN'
  AND usr.TABLE_NAME is null
GROUP BY m.TABLE_NAME
;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM