【问题标题】:Oracle Sibling StructureOracle 同级结构
【发布时间】:2015-01-15 09:40:43
【问题描述】:

我有一个在数据库表中存储相等记录的结构。你可以认为这些记录是兄弟。例如我在这张表中有两条记录; 1=2 和 1=3。我需要一个查询来返回给定记录的所有兄弟姐妹。让我举个例子;

这是我的两列表格:

create table SIBLINGSTEST(col1 number, col2 number);

我有 2 条记录,1=2 和 1=3

insert into SIBLINGSTEST values(1,2);
insert into SIBLINGSTEST values(1,3);

我认为使用connect by是这种情况的最佳解决方案,并编写以下查询:

SELECT * FROM SIBLINGSTEST 
START WITH (col1 = 1 or col2 = 1) 
CONNECT BY NOCYCLE (
          (PRIOR col1 = col1) or
          (PRIOR col1 = col2) OR
          (PRIOR col2 = col1) or
          (PRIOR col2 = col2))

此查询返回正确的结果,返回两行。

如果我使用 2 作为参数,查询也会正确运行,再次返回两行。

但是如果我使用 3 作为参数,查询不会像我预期的那样运行,只返回起始行。

SELECT * FROM SIBLINGSTEST 
START WITH (col1 = 3 or col2 = 3) 
CONNECT BY NOCYCLE (
          (PRIOR col1 = col1) or
          (PRIOR col1 = col2) OR
          (PRIOR col2 = col1) or
          (PRIOR col2 = col2))

我想知道为什么 2 和 3 的结果不同。任何帮助或想法都会被应用。

谢谢。

【问题讨论】:

  • 我不明白。什么叫兄弟姐妹?当列中的值出现多次时?
  • 让我通过我的例子来解释它。 1 和 2 是兄弟姐妹。 1和3也是兄弟姐妹。所以 2 和 3 也是兄弟姐妹(间接)。插入我的表时,我有重复值检查,这些情况不在我的关注范围内。
  • 还有一件事,问题出现在我们的测试数据库中,运行 oracle 10g 版本 10.2。而且我只是在一个11g的数据库上测试了情况,没有问题。查询按我的预期运行。我认为这是 11g 修复的错误。

标签: oracle siblings connect-by hierarchical-query


【解决方案1】:

我按预期得到了您最后一个查询的两行:

SQL> SELECT * FROM SIBLINGSTEST 
  2  START WITH (col1 = 3 or col2 = 3) 
  3  CONNECT BY NOCYCLE (
  4            (PRIOR col1 = col1) or
  5            (PRIOR col1 = col2) OR
  6            (PRIOR col2 = col1) or
  7            (PRIOR col2 = col2));

      COL1       COL2
---------- ----------
         1          3
         1          2

但是我不会选择以这种方式建模。如果您真正想要的是记录 1、2、3 是兄弟姐妹,那么我会使用:

create table siblings_group (group_id number);
create table people (person_id number, group_id number);
insert into siblings_group values (1);
insert into people values (1, 1);
insert into people values (2, 1);
insert into people values (3, 1);

然后找到 3 的所有兄弟姐妹:

SQL>  select person_id from people where group_id =
  2    (select group_id from people where person_id=3);

 PERSON_ID
----------
         1
         2
         3

【讨论】:

  • 感谢您的回答。正如我在评论中提到的,我认为这是甲骨文的错误。问题出现在我们的测试数据库中,运行 oracle 10g 版本 10.2。而且我只是在一个11g的数据库上测试了情况,没有问题。查询像我预期的那样运行。我认为这是 11g 修复的错误。
  • 关于你的结构,是的,它也是合乎逻辑的。但是你的结构不符合我客户的实际要求。我已经详细说明了这个问题,但实际上,我们使用类似的结构来定义相关培训。例如,有 A=B 和 B=C 和 C=D 和 D=E 等定义,以此类推。我无法对这些记录进行分组,因为预计如果删除 C=D 关系,A 和 E 将不再相关。无论如何,我的客户正在使用 oracle 版本 11g,我已经在他们的环境中对其进行了测试,并且运行正常 :) 感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 2014-07-23
  • 1970-01-01
  • 2011-12-19
相关资源
最近更新 更多