Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql-如何实现一个表,其中很少有属性只是对另一个元组的引用?_Sql_Oracle_Oracle11g_Oracle Adf - Fatal编程技术网

sql-如何实现一个表,其中很少有属性只是对另一个元组的引用?

sql-如何实现一个表,其中很少有属性只是对另一个元组的引用?,sql,oracle,oracle11g,oracle-adf,Sql,Oracle,Oracle11g,Oracle Adf,我有一个Sql表,如下所示:- > select * from table1; |--------------------------------------------------| | ID | A1 | A2 | B1 | B2 | C1 | C2 | REF_B | REF_C | |--------------------------------------------------| | 1 | a1 | a1 | b1 | b1| c1 |

我有一个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\u B
    属性指向的元组值
  • C1
    C2
    是当前行的
    REF\u C
    属性指向的元组值
  • REF_B
    指同一个表中另一个元组的
    ID
    ,我们应该从中获得
    Bx
    的值
  • REF_C
    指同一个表中另一个元组的
    ID
    ,我们应该从中获得
    Cx
    的值
在上述方法中,我们面临的明显问题是将元组
1
中的更改传播到元组
2
3
。现在我们已经使用编程方法(Java代码)来实现这一点

这既难又不美

拟议变更 将
表1
分为三个表

> 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
将是这三个表联接的可更新视图

> 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 |
    |--------------|
  • 您认为这种方法有任何可能的缺陷吗
  • 有更简单的解决办法吗
  • 对于新的
    表1
    ,我们可能有哪些限制<代码>表1直接映射到ADF实体对象
使用触发器:

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;

听起来您建议的解决方案是对原始表进行规范化,假设您将REF_a和REF_B(尽管我自己将这些a_ID和B_ID命名)作为table1_B和table1_c的外键。这就是你的想法吗

我不清楚的一点是,如果两列包含相同的数据,为什么这里需要两列(A1和A2)。如果结果中需要两个副本,您不能将其合并到一个列中,然后简单地选择两次吗?即,假设您只有一个“A”列而不是A1/A2列:

select A, A from table1....
但是,我可能错过了这里的预期用例

我从未使用过ADF,但oracle文档似乎暗示您可以引用以下视图:

实体对象映射到数据源中的单个对象。在绝大多数情况下,这些>是数据库中的表、视图、同义词或快照


如果这不是很有帮助,也许可以添加一些关于此表的基本用途的详细信息。

我对触发器和Sql都是新手,所以我可能错了,但您似乎假设元组2和3已经存在,然后我们插入元组1。但在我的场景中,元组1总是在插入引用元组之前出现。此外,这是一个简化的情况。我的表有三个以上的
A
属性。即使我在插入元组2和3的行时手动处理数据复制,它仍然忽略了更多问题。对于元组1,可以更新任何属性。因为属性组
C
实际上运行数百个,所以我们不能为所有属性设置触发器。此外,将数百个属性复制到虚拟行是没有效率的。我不确定我当时是否理解了你的问题。在你的问题中让列名和列内容相等会把事情搞砸。对不起,我想不出别的了。请不要将列内容与列名称关联
B1
等于
B1
等于1=2.)但是
b1
肯定等于其他行中的
b1