如何根据主外键关系,自动生成查询SQL语句

kim_fu 2014-09-26 09:08:39
库里有若干表,表之间建立好主外键关系,如何任意选取字段后,自动生成查询语句。

比如表T1,T2,T3,T4,T5的关系如下

T1___
T2___
T3
___
T4___
T5

T3是T2的子表,T2是T1的子表,T5是T4的子表,T4是T1的子表

如果查询 T1.F1 ,T2.F1,T3.F1,T5.F1那么查询语句大致应该是
SELECT T1.F1,T2.F1,T3.F1,T5.F1 FROM T1,T2,T3 WHERE T1.K1 = T2.K1 AND T2.K1 = T3.K1 AND T1.K1 = T4.K1 AND T4.K1 = T5.K1

如何根据用户所选字段,自动生成查询SQL语句?


...全文
417 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
bw555 2014-09-26
  • 打赏
  • 举报
回复
引用 7 楼 kim_fu 的回复:
先谢谢两位,我的库里有200多张表,用你们的语句试了下,使用三张表,结果10分钟也没出结果。能否优化下语句。
我这测试1秒不到,执行慢应该不是语句的事
kim_fu 2014-09-26
  • 打赏
  • 举报
回复
两位的SQL语句我都试验了。都没查出结果,而且耗时很长啊。
kim_fu 2014-09-26
  • 打赏
  • 举报
回复
先谢谢两位,我的库里有200多张表,用你们的语句试了下,使用三张表,结果10分钟也没出结果。能否优化下语句。
bw555 2014-09-26
  • 打赏
  • 举报
回复
引用 4 楼 wildwave 的回复:
[quote=引用 3 楼 bw555 的回复:] [quote=引用 1 楼 wildwave 的回复:]
你的语句有可能会产生重复记录吧,是否考虑增加distinct[/quote] 何以见得?举个栗子[/quote] 我刚才把你语句中的table_name in ('T1','T2','T3','T4','T5')去掉,在system用户下执行,不加distinct 310条,加完distinct308条,有两条重复
bw555 2014-09-26
  • 打赏
  • 举报
回复
假设T1表有两个外键,同时外键关联T2表的同一个字段 TI字段C1 外键关联 T2表C1 TI字段C2 外键关联 T2表C1 这种情况下,T2在form子句中要有两个才行,这样的话from子句也得动态生成才行吧 举个例子 文件收发记录 发文部门 外键管理 部门编码,同时收文部门也外键管理部门编码
小灰狼W 2014-09-26
  • 打赏
  • 举报
回复
引用 3 楼 bw555 的回复:
[quote=引用 1 楼 wildwave 的回复:]
你的语句有可能会产生重复记录吧,是否考虑增加distinct[/quote] 何以见得?举个栗子
bw555 2014-09-26
  • 打赏
  • 举报
回复
引用 1 楼 wildwave 的回复:
你的语句有可能会产生重复记录吧,是否考虑增加distinct
bw555 2014-09-26
  • 打赏
  • 举报
回复
试一下,未测试,如果非dba用户可以把数据字典表的DBA_改为USER_
SELECT A.TABLE_NAME||'.'||A.COLUMN_NAME||'='||B.TABLE_NAME||'.'||B.COLUMN_NAME
FROM
(select A.CONSTRAINT_NAME,B.TABLE_NAME,B.COLUMN_NAME,A.R_CONSTRAINT_NAME
from dba_CONSTRAINTS A,DBA_CONS_COLUMNS B where constrainT_type='R' AND A.CONSTRAINT_NAME=B.CONSTRAINT_NAME
AND B.TABLE_NAME IN ('K1','K2','K3','K4','K5')) A,
(select distinct A.R_CONSTRAINT_NAME,B.TABLE_NAME,B.COLUMN_NAME
from dba_CONSTRAINTS A,DBA_CONS_COLUMNS B where constrainT_type='R' AND A.R_CONSTRAINT_NAME=B.CONSTRAINT_NAME
AND B.TABLE_NAME IN ('K1','K2','K3','K4','K5')) B
WHERE A.R_CONSTRAINT_NAME=B.R_CONSTRAINT_NAME;
小灰狼W 2014-09-26
  • 打赏
  • 举报
回复
select t1.table_name, t3.column_name, t2.table_name, t2.column_name from user_CONSTRAINTS t1, user_cons_columns t2, user_cons_columns t3 where t1.constraint_type = 'R' and t1.r_constraint_name = t2.constraint_name and t2.table_name in ('T1','T2','T3','T4','T5') and t1.table_name in ('T1','T2','T3','T4','T5') and t1.constraint_name = t3.constraint_name 找出这几个表之间的外键关系。前两个列是外键所在的表和字段,后面两个列是对应的主键所在表和字段 然后就是把select后面和字段和where后面的条件拼起来即可

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧