Построение запроса из столбцов в таблице - PullRequest
2 голосов
/ 16 марта 2019

У меня есть локальная таблица, которая включает в себя несколько столбцов. Некоторые из этих столбцов заполнены, некоторые пустые Они состоят из метаданных других таблиц, таких как:

SCHEMA TABLE_NAME DRIVER_TABLE JOIN_COND_1 JOIN_COND_2

Вот пример того, как могут выглядеть некоторые фиктивные данные:

SCHEMA TABLE_NAME DRIVER_TABLE JOIN_COND_1 JOIN_COND_2
BOB    TRUCKS     NULL         NULL        NULL
BOB    VANS       USER.XXX     A.ID=B.ID   NULL
BOB    CARS       USER.XXX     A.ID=B.ID   B.END_DTE >= '01-DEC-2018'

Причина, по которой таблица существует, заключается в создании средства для подсчета строк в другой базе данных.

Мне нужно найти способ, с помощью которого я могу получить вывод, подобный следующему, используя таблицу:

SCHEMA TABLE_NAME COUNT
BOB    TRUCKS     878908
BOB    VANS       7899
BOB    CARS       876

Таблица метаданных будет источником запроса, но запрос должен быть в одном блоке кода. Я не уверен, с чего начать.

Таблица драйверов представляет собой список идентификаторов, ограничивающих количество, и используется только в том случае, если она там есть.

Итак, в первой строке, где нет «таблицы драйверов», просто NULL будет просто:

Select SCHEMA, TABLE_NAME, count(*) COUNT from METADATA;

Второй запрос должен использовать таблицу драйверов и присоединиться:

Select SCHEMA, TABLE_NAME, count(*) COUNT from METADATA A, USER.XXX B
WHERE A.ID=B.ID;

И третий запрос будет:

Select SCHEMA, TABLE_NAME, count(*) COUNT from METADATA A, USER.XXX B
WHERE A.ID=B.ID
AND B.END_DTE >= '01-DEC-2018';

Итак, весь этот sql должен быть построен из того, что находится в столбцах метаданных.

Я думал о какой-то группе циклов, основанной на том, чтобы получить столбцы в переменные и затем сформируйте логическую схему if, then, else.

DECLARE
l_sql_1    VARCHAR2(100);
l_sql_2    VARCHAR2(100);
l_sql_3    VARCHAR2(100);
l_sql_4    VARCHAR2(100);


BEGIN
l_sql_1 := 'SELECT SCHEMA||'.'||TABLE_NAME FROM METADATA';
l_sql_2 := 'SELECT DRIVER_TABLE FROM METADATA';
l_sql_3 := 'SELECT JOIN_COND_1 FROM METADATA';
l_sql_4 := 'SELECT JOIN_COND_2  FROM METADATA';

У кого-нибудь есть идеи, как мне это сделать, пожалуйста?

Ответы [ 2 ]

2 голосов
/ 16 марта 2019

Вы можете использовать dynamic sql как

SQL> set serveroutput on;
SQL> declare
 v_sql    varchar2(4000);
 v_schema varchar2(40);
 v_table  varchar2(40); 
 v_count  pls_integer;
begin
  dbms_output.put_line('schema  table   count');                       
  dbms_output.put_line('------  -----   -----');
 for c in ( select * from metadata )
 loop
   v_schema := c.schema;
   v_table  := c.table_name;
   v_sql := 'select count(*) from '||c.table_name||' a ';
  if c.driver_table is not null then
   v_sql := v_sql ||' join '||c.driver_table||' b on a.id=b.id ';
    if c.join_cond_2 is not null then
     v_sql := v_sql ||' where '||c.join_cond_2;     
    end if;   
  end if;
  execute immediate v_sql into v_count;
  dbms_output.put_line(v_schema||'     '||v_table||'    '||v_count);
 end loop;   
end; 
0 голосов
/ 16 марта 2019

Если вы используете Transact-SQL, вы, вероятно, можете подключиться к системным представлениям.

SELECT SCH.[name] AS [SCHEMA]
, ST.[name] AS [TABLE_NAME]
, SUM(SP.[rows]) AS [ROW_COUNT]
FROM sys.tables AS ST
INNER JOIN sys.partitions AS SP ON ST.object_id = SP.object_id
INNER JOIN sys.schemas AS SCH ON SCH.schema_id = ST.schema_id
AND SP.[index_id] IN (0, 1)
--WHERE ST.[name] LIKE '<your table name>' + '%' -- Optional
GROUP BY SCH.[name], ST.[name]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...