假设我有一个PK列的给定值:
10
是否有查询要查找与该特定pk值有关系的所有表?
答案 0 :(得分:3)
单列PK的示例。 PK约束名称可以从DBA_CONSTRAINTS(USER_CONSTRAINTS,ALL_CONTRAINTS)派生。 可以使用PK值集合
将代码扩展为多列PKdeclare
p_pk_name varchar2(30):= '<PK constraint_name>';
p_pk_value varchar2(500):='<PK value>';
l_cnt int;
begin
for x in
(
select t.owner, t.table_name, cc.column_name
from dba_constraints c,
dba_tables t,
dba_cons_columns cc
where c.r_constraint_name = p_pk_name
and t.owner = c.owner
and t.table_name = c.table_name
and cc.owner = c.owner
and cc.constraint_name = c.constraint_name
)
loop
execute immediate 'select count(1) from '||x.owner||'.'||x.table_name|| ' where '||x.column_name||' = :p_pk_value and rownum <= 1' into l_cnt using p_pk_value ;
if l_cnt <> 0 then
dbms_output.put_line(x.owner||'.'||x.table_name);
end if;
end loop;
end;
答案 1 :(得分:2)
不是单个查询,但您可以编写PL / SQL块来执行此操作。您首先查询USER_CONSTRAINTS(或ALL_CONSTRAINTS或DBA_CONSTRAINTS)以查找具有引用给定主键的外键的表。对于每个,您都要创建并执行动态SQL查询,以查看是否有任何行具有您感兴趣的特定PK值。
使其适用于多列密钥将是一项额外的挑战。
答案 2 :(得分:0)
以下是它在SQL Server中的外观:
DECLARE @keyColumn VARCHAR(100)
DECLARE @keyValue INT
SET @keyColumn = 'SiteID'
SET @keyValue = 400
SELECT 'SELECT ''' + TABLE_NAME + ''' AS TABLENAME, "' + @keyColumn
+ '" FROM "' + TABLE_NAME + '" WHERE "' + @keyColumn + '" = '
+ CONVERT(VARCHAR(100), @keyValue) + ' UNION ALL'
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU
WHERE KCU.COLUMN_NAME = @keyColumn
我知道Oracle有INFORMATION_SCHEMA
,所以类似的东西应该有效。
我尝试使用SQLFiddle来适应它但失败了。也许这里的其他人可以编辑我的答案,以便与Oracle合作。
以下是生成的SQL的部分内容:
SELECT 'StockInventory' AS TABLENAME, "SiteID" FROM "StockInventory" WHERE "SiteID" = 400 UNION ALL
SELECT 'SiteDomains' AS TABLENAME, "SiteID" FROM "SiteDomains" WHERE "SiteID" = 400 UNION ALL