Oracle,根据表名生成Where子句

Posted

技术标签:

【中文标题】Oracle,根据表名生成Where子句【英文标题】:Oracle, generate Where clause based on table names 【发布时间】:2016-10-03 07:55:11 【问题描述】:

场景: 我将 2 个表名(例如员工和部门)传递给 pl/sql 过程。 我想这个程序生成像'WHERE employees.department_id = departments.department_id' 这样的 WHERE 子句,所以基本上这个程序必须找到关键关系。

我尝试使用 all_constraints 表查找 constraint_type='P' 或 'F' 然后找到关联的列,但在此表中没有关于约束中使用了哪一列的信息。 有谁知道我该怎么做(可能以不同的方式)?

【问题讨论】:

查看 all_cons_columns。只是好奇您需要动态sql的目的是什么?我认为你重新发明了 ORM。 硕士论文-测试等 【参考方案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;

【讨论】:

这将非常有帮助。谢谢!【参考方案2】:

使用自然连接怎么样?

如果两个表的列名一致,Natural Join 子句将在每个公共列名上连接表。

例如,来自文档:

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

如果表 COUNTRIES 和 CITIES 有两​​个名为的公共列 COUNTRY 和 COUNTRY_ISO_CODE,下面两个 SELECT 语句是 等效:

SELECT * FROM COUNTRIES NATURAL JOIN CITIES

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

【讨论】:

如果employeesdepartments 表都有manager_id 列,那么自然连接将在连接条件中包含此列。部门经理会和员工经理一样吗?可能不会,因此您需要非常小心使用自然连接,因为它可能会产生意想不到的后果。 更不用说namedescriptioncommentsstart_dateend_datestatus 等。许多模式使用命名约定,如cities.country_id = countries.idcities.city_ctry_id = countries.ctry_id .我不明白为什么 Natural Join 的发明者会认为它会起作用。

以上是关于Oracle,根据表名生成Where子句的主要内容,如果未能解决你的问题,请参考以下文章

Oracle初级优化sql

Oracle 优化相关

oracle group by 性能优化

[MySQL] 过滤数据

如何优化SQL语句

Oracle的where子句