2016-10-03 63 views
0

方案: 我将2个表名(f.e. Employees和departments)传递给pl/sql过程。 我想这个程序生成WHERE子句,如'WHERE employees.department_id = departments.department_id'所以基本上这个程序必须找到关键的关系。Oracle,根据表名生成Where子句

我试图使用all_constraints表来查找constraint_type ='P'或'F',然后找到关联的列,但在此表中没有关于约束中使用哪个列的信息。 有没有人有一个想法我怎么能做到这一点(mayby以不同的方式)?

+0

查看all_cons_columns。只是为了什么目的,你需要动态sql吗?我认为你要重塑ORM。 –

+0

硕士论文 - 测试等 –

回答

1

试试这个代码:

SELECT UC.OWNER 
,  UC.CONSTRAINT_NAME 
,  UCC1.TABLE_NAME||'.'||UCC1.COLUMN_NAME "CONSTRAINT_SOURCE" 
,  'REFERENCES' 
,  UCC2.TABLE_NAME||'.'||UCC2.COLUMN_NAME "REFERENCES_COLUMN" 
FROM USER_CONSTRAINTS uc 
, USER_CONS_COLUMNS ucc1 
, USER_CONS_COLUMNS ucc2 
WHERE UC.CONSTRAINT_NAME = UCC1.CONSTRAINT_NAME 
    AND UC.R_CONSTRAINT_NAME = UCC2.CONSTRAINT_NAME 
    AND UCC1.POSITION = UCC2.POSITION -- Correction for multiple column primary keys. 
    AND UC.CONSTRAINT_TYPE = 'R' 
ORDER BY UCC1.TABLE_NAME 
,  UC.CONSTRAINT_NAME; 
+0

这将是非常有益的。谢谢! –

+0

你能接受这个答案吗? – starko

0

如何使用自然连接?

如果列名在两个表中保持一致,则Natural Join子句将在每个公共列名称上加入表。

例如,从文档:

https://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqljnaturaljoin.html

如果表的国家和城市有命名为
国家和COUNTRY_ISO_CODE,两个共列了以下两个SELECT语句是 等价的:

SELECT * FROM COUNTRIES NATURAL JOIN CITIES 

SELECT * FROM COUNTRIES JOIN CITIES 
USING (COUNTRY, COUNTRY_ISO_CODE) 
+2

如果'employees'和'departments'表都有'manager_id'列,那么自然连接将在连接条件中包含这个。部门经理是否与员工经理一样?可能不会,所以你需要非常小心,自然连接,因为它可能有意想不到的结果。 – MT0

+1

更不用说'name','description','comments','start_date','end_date','status'等等。许多模式使用命名约定,例如'cities.country_id = countries.id'或'cities.city_ctry_id = countries.ctry_id'。我不明白为什么Natural Join的发明人认为它会起作用。 –