我有以下SQL for ORACLE(10 g)
select origTabCols.owner, origTabCols.table_name,
(select COUNT(*) from all_tab_columns
where MARKET_ID = 1) as MarketCount
from all_tab_columns origTabCols
where origTabCols.column_name = 'MARKET_ID'
group by origTabCols.owner, origTabCols.table_name
order by origTabCols.table_name asc;
此部分获取具有列MARKET_ID的所有表
select owner, table_name from all_tab_columns
where column_name = 'MARKET_ID'
order by table_name;
但是现在,我需要列MARKET_ID = 1的表中的所有行以及每个结果集MARKET_ID = 1的行数。
结果应如下所示:
ID | OWNER | TABLE_NAME | ROWS_PER_TABLE
-----------------------------------------------------
1 DBA TABLE_1 45
2 DBA TABLE_2 452
3 DBA TABLE_3 13
4 DBA TABLE_4 95
进一步扩展,如果有一个子表的FOREIGN KEY,其中MARKET_ID = 1,我也需要知道这一点,以便执行CASCADING遍历
就像这样...
ID | OWNER | TABLE_NAME | ROWS_PER_TABLE | FOREIGN_KEY | NUM_ROWS
------------------------------------------------------------------------------------
1 DBA TABLE_1 45 FK_ID_1 3
2 DBA TABLE_2 452 FK_ID_2 1556
3 DBA TABLE_3 13 FK_ID_3 365
4 DBA TABLE_4 95 FK_ID_4 22
谢谢你的帮助。
更新:
我实际上扩展了调用以反映PL/SQL中的解决方案
剩下的就是得到子表中的行的数量了.
set serveroutput on;
DECLARE
parent_table_name VARCHAR2(30) := 'AGREEMENT';
sql_stmt VARCHAR2(2000);
cursor_child_tables SYS_REFCURSOR;
child_table_name VARCHAR2(30);
column_name varchar(100);
BEGIN
OPEN cursor_child_tables FOR
SELECT C.table_name
FROM all_constraints C
JOIN all_cons_columns CC ON C.constraint_name = CC.constraint_name
WHERE C.R_CONSTRAINT_NAME IN (
SELECT CONSTRAINT_NAME from all_constraints WHERE table_name=parent_table_name
)
AND C.CONSTRAINT_TYPE = 'R';
LOOP
FETCH cursor_child_tables INTO child_table_name;
EXIT WHEN cursor_child_tables%NOTFOUND;
sql_stmt := 'SELECT * FROM ' || child_table_name;
DBMS_OUTPUT.PUT_LINE('Child_Table: ' || child_table_name);
DECLARE
cursor_columns SYS_REFCURSOR;
BEGIN
OPEN cursor_columns FOR
SELECT column_name
FROM all_tab_columns
WHERE table_name = child_table_name;
LOOP
FETCH cursor_columns INTO column_name;
EXIT WHEN cursor_columns%NOTFOUND;
END LOOP;
CLOSE cursor_columns;
END;
END LOOP;
CLOSE cursor_child_tables;
END;
更新二:
所有,我们别无选择,只能使这与SQL工作.所以,我把它简化为三个步骤:
我想做的是把STEP 1作为一个循环插入到STEP 2中的ACCT_CODE中,然后当我找到子表时,我只需要继续循环TBL 1- 'TBL-....'并在输出中显示所有记录。
在DB中总共120个TABLES中,可能的PABLES表的总数不会超过31个。ACCT_CODE在本例中有4个CHILD表,TBL 1有1个ROW表。TBL 2-TBL 4可以是1 -“n”
我快到了
-- STEP 1
select owner, table_name from all_tab_columns
where column_name = 'MARKET_ID'
order by table_name;
-- STEP 2
set serveroutput on;
DECLARE
parent_table_name VARCHAR2(30) := 'ACCT_CODE';
--CHILD TABLES for ACCT_CODE
--Child_Table: TBL1
--Child_Table: TBL2
--Child_Table: TBL3
--Child_Table: TBL4
sql_stmt VARCHAR2(2000);
cursor_child_tables SYS_REFCURSOR;
child_table_name VARCHAR2(30);
column_name varchar(100);
BEGIN
OPEN cursor_child_tables FOR
SELECT C.table_name
FROM all_constraints C
JOIN all_cons_columns CC ON C.constraint_name = CC.constraint_name
WHERE C.R_CONSTRAINT_NAME IN (
SELECT CONSTRAINT_NAME from all_constraints WHERE table_name=parent_table_name
)
AND C.CONSTRAINT_TYPE = 'R';
LOOP
FETCH cursor_child_tables INTO child_table_name;
EXIT WHEN cursor_child_tables%NOTFOUND;
sql_stmt := 'SELECT * FROM ' || child_table_name;
DBMS_OUTPUT.PUT_LINE('Child_Table: ' || child_table_name);
DECLARE
cursor_columns SYS_REFCURSOR;
BEGIN
OPEN cursor_columns FOR
SELECT column_name
FROM all_tab_columns
WHERE table_name = child_table_name;
LOOP
FETCH cursor_columns INTO column_name;
EXIT WHEN cursor_columns%NOTFOUND;
END LOOP;
CLOSE cursor_columns;
END;
END LOOP;
CLOSE cursor_child_tables;
END;
-- STEP 3
select * from ACCT_CODE
where MARKET_ID = 1;
1条答案
按热度按时间des4xlb01#
不确定,但我想你可以收集所有你需要的数据,除了MARKET_ID = 1的表中的行数。对于这一部分,你需要动态SQL,这意味着使用PL/SQL。无论如何,你可以从下面的代码中得到一些有用的东西。
首先是一些虚拟的样本数据:
创建一个CTE(命名为网格),它将收集具有MARKET_ID列和与表关联的外键的表。
有了这个结果,你就可以得到表格和它们的PK - FK关系。下面的代码为您提供了这些关系,并准备了与PL/SQL一起使用的动态SQL语句,以便您可以获得MARKET_ID = 1的行。
LISTAGG(Distinct...)可能不适用于10 g-它在这里只是描述互连,你不需要它。
PL/SQL代码,Cursor声明自上述代码。
NUM_ROWS_1列是MARKET_ID = 1的每个表的行数
希望你能根据你的实际情况调整一下。