我有一个Sql表,如下所示: -
> select * from table1;
|--------------------------------------------------|
| ID | A1 | A2 | B1 | B2 | C1 | C2 | REF_B | REF_C |
|--------------------------------------------------|
| 1 | a1 | a1 | b1 | b1| c1 | c1 | 1 | 1 |
| 2 | a2 | a2 | b2 | b2| c1 | c1 | 2 | 1 |
| 3 | a3 | a3 | b1 | b1| c1 | c1 | 1 | 1 |
|--------------------------------------------------|
ID
是主键。A1
和A2
对每个元组都是唯一的。B1
和B2
是当前行的REF_B
属性指向的元组的值。C1
和C2
是当前行的REF_C
属性指向的元组的值。REF_B
指的是同一个表中另一个元组的ID
,我们应该从中获取Bx
的值。REF_C
指的是同一个表中另一个元组的ID
,我们应该从中获取Cx
的值。在上述方法中,我们面临的一个明显问题是将元组1
中所做的更改传播到元组2
和3
。现在我们已经使用程序化方法(Java代码)来实现这一目标。
这既困难又不美观。
将table1
划分为三个表格。
> select * from table1_a;
|------------------------------|
| ID | A1 | A2 | REF_B | REF_C |
|------------------------------|
| 1 | a1 | a1 | 1 | 1 |
| 2 | a2 | a2 | 2 | 1 |
| 3 | a3 | a3 | 1 | 1 |
|------------------------------|
> select * from table1_b;
|--------------|
| ID | B1 | B2 |
|--------------|
| 1 | b1 | b1 |
| 2 | b2 | b2 |
|--------------|
> select * from table1_c;
|--------------|
| ID | C1 | C2 |
|--------------|
| 1 | c1 | c1 |
|--------------|
table1
将是这三个表的连接的可更新视图。
table1
可能有哪些限制。 table1
直接映射到ADF实体对象。答案 0 :(得分:0)
使用触发器:
CREATE OR REPLACE TRIGGER upd_table1
BEFORE UPDATE OF a1
OR UPDATE OF a2
ON TABLE1
REFERENCING new AS new
BEGIN
UPDATE table1
SET b1 = new.a1, b2 = new.a2
WHERE refb = new.id;
UPDATE table1
SET c1 = new.a1, c2 = new.a2
WHERE refc = new.id;
END;
答案 1 :(得分:0)
听起来您提出的解决方案是原始表格的标准化,假设您制作了REF_A& REF_B(虽然我自己将这些A_ID和B_ID命名为)table1_b和table1_c的外键。那是你的想法吗?
我不清楚的一件事是,如果它们包含相同的数据,您需要两列(A1和A2)。难道你不能将它合并到一个列中,如果在结果中需要两个副本,那么只需选择两次吗?即,假设您只有一个“A”列而不是A1 / A2:
select A, A from table1....
但是,我可能会错过这里的预期用例。
我从未使用过ADF,但oracle文档似乎暗示你可以引用一个视图:
实体对象映射到数据源中的单个对象。在绝大多数情况下,这些>是数据库中的表,视图,同义词或快照。
如果这不是很有帮助,可能会添加一些有关此表的基本目的的详细信息。