Как выполнить один запрос по всем таблицам в пользовательской схеме в ORACLE - PullRequest
0 голосов
/ 12 февраля 2019

Допустим, у меня есть таблицы A,B,C,......,Z, и я хочу подсчитать все записи в таблицах и объединить результаты следующим образом:

SELECT 'A' AS A, count(*) from USER.A UNION  
. 
. 
.
SELECT 'J' AS J, count(*) from USER.J UNION
.
.
SELECT 'Z' AS 'Z' COUNT(*) from USER.Z 

Я хочу избежать всех вышеупомянутых хлопот.Как я могу сделать это умным способом?.

1 Ответ

0 голосов
/ 12 февраля 2019

Я стремлюсь сделать это, написав запрос, используя user_tables Просмотр метаинформации и впервые выделив текст, который на самом деле является запросом sql:

SELECT 'select '''||TABLE_NAME||''', count(*) from '||TABLE_NAME||'union all' FROM USER_TABLES

Запуск этого в вашем инструменте запроса приведет ксетка строк, которые на самом деле являются sql-запросами сами по себе.Копирование их из таблицы результатов, вставка их в окно запроса (удаление завершающего UNION ALL) и повторный запуск их приводят к получению данных для каждой таблицы

select 'a', count(*) from a union all
select 'b', count(*) from b union all ....

Чтобы получить больше информации и включить имена столбцов, естьUSER_TAB_COLUMNS представление, которое цитирует информацию о столбцах (например, вы можете написать запрос, который генерирует запросы, которые ищут во всех столбцах varchar определенное значение)

Если вы действительно вовлечены, может быть более чистым использовать заполнители в строке и REPLACEони:

SELECT REPLACE(REPLACE(REPLACE(

  'select ''{o}.{t}'' as tname, ''{c}'' as cname 
   from {o}.{t} where 
    {c} like ''hello%'' or 
    {c} like ''goodbye%'' union all' 

  --to add more placeholders copy paste these lines 
  --and ensure there is the same number of REPLACE 
  --as there are numbers of lines 
  , '{t}', TABLE_NAME)
  , '{c}', COLUMN_NAME)
  , '{o}', OWNER)

FROM ALL_TAB_COLUMNS
WHERE DATA_TYPE = 'VARCHAR'

Это намного чище, чем запуск и остановка вашей струны все время с помощью ||конкатенации.Я намеренно прописал прописными буквами внешний запрос и прописными буквами внутренний запрос, чтобы вы могли определить, какая часть является какой

Чтобы добавить больше заполнителей, поместите дополнительный REPLACE (вверху и скопируйте и вставьте вместо строк, начинающихся сзапятая. Пример копирования , '{t}', table_name) вставьте и измените на , '{d}', data_type) добавьте еще один REPLACE( вверху, и теперь у вас есть заполнитель {d}, который можно использовать в любом месте первой строки (шаблон запроса sql) для обозначения данныхтип

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...