【问题标题】:Maintain one to many relationship保持一对多关系
【发布时间】:2017-06-29 05:31:02
【问题描述】:

我想确保在一段 Oracle SQL 代码中保持一对多关系。代码如下所示: SQL 的第一部分通过仅获取一列 cont_id 并将其分组以使其每行一个 ID 来创建视图 cont_ID_group。

第二个视图对 mix_id 执行相同的操作。视图 AS_BUILT_DATA 是是否维护一对多关系的第一个示例。我正在使用 as_built_Groups 视图来创建这种关系。

最后一段代码是最重要的,因为它会在我将其映射到 ArcGIS 之前创建最终数据集。我再次尝试通过将 DATABASE_PROJECT_MAPPABLE 视图和 AS_BUILT_DATA 与 cont_ID_group 视图相关联来保持一对多的关系。

DATABASE_PROJECT_MAPPABLE 和 AS_BUILT_DATA 具有多对多关系。

create or replace view cont_ID_group as
select cont_id
from DATABASE_PROJECT_MAPPABLE
group by cont_id
;
create or replace view as_built_Groups as
select t.mix_id 
from SMGR.T_CONT_MIX_DSN t
group by t.mix_id
;
create or replace view AS_BUILT_DATA as
select d.cont_id,t.* 
from SMGR.T_SUPERPAVE t
inner join as_built_Groups s 
on t.mix_id = s.mix_id
inner join SMGR.T_CONT_MIX_DSN d
on d.mix_id = s.mix_id
;
select distinct t.*,
from DATABASE_PROJECT_MAPPABLE t inner join cont_ID_group i
on t.cont_id = i.cont_id inner join AS_BUILT_DATA s
on s.cont_id = i.cont_id
order by t.Corridor_RB,t.PROJECT_START,t.PROJECT_NUMBER

【问题讨论】:

  • 那么....你有问题吗?
  • 是的,我想知道我是否保持一对多的关系。
  • ...哪些列之间的一对多关系?您确实明白我们不能神奇地窥探您的数据库并查看您的数据,对吗?我们也看不到您从中构建数据的表之间的任何实体关系。
  • 在最终选择语句中的 cont_id 列之间
  • 好的...为什么不在结果数据中进行必要的聚合(将其保存到表中之后)并找出答案? 您希望我们如何神奇地为您做到这一点???

标签: sql join oracle11g


【解决方案1】:

视图不强制关系。如果你想维护(强制)一对多关系,你应该在“父”表上创建一个PRIMARY KEY,然后在子表上创建一个FOREIGN KEY,它引用父表的主键,

【讨论】:

  • 是的,这是问题的一部分。最终的 sql 查询也将成为一个视图,以便它可以定期更新新数据并拉入 GIS 进行制图。所以创建或替换视图是最好的选择。
  • 我正在尝试创建一个数据集视图,它可以由对 SQL 或编程一无所知的人单独使用并从 GIS 运行。不是我有什么了不起的。
  • 在表上创建 PRIMARY KEY / FOREIGN KEY (PK/FK) 关系并不妨碍您创建任何视图;它们并不相互排斥。但你最初的问题是关于维持这些关系。此外,在某些情况下,使用 PK/FK 可以提供性能优化。
  • 创建第三个视图 SMGR.T_SUPERPAVE 和 SMGR.T_CONT_MIX_DSN 的两个表具有复合主键,它们都在我不管理的另一个模式中。 DATABASE_PROJECT_MAPPABLE 是另一个没有任何键的视图。
  • 这不是那么微妙:)。这几乎是标准的数据库设计 :)
猜你喜欢
  • 2010-12-20
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
相关资源
最近更新 更多