2015-01-15 122 views
1

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

这是我的表有两列:

create table SIBLINGSTEST(col1 number, col2 number); 

我有2个,1 = 2和1 = 3

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

我想用连接的是这种情况的最佳解决方案,并写入以下查询:

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的结果不同。任何帮助或想法都将被评价。

谢谢。

+0

我不明白这一点。你叫什么兄弟姐妹?当列中的值出现多次? –

+0

让我通过我的例子来解释它。 1和2是兄弟姐妹。 1和3也是兄弟姐妹。所以2和3也是兄弟姐妹(间接)。当插入到我的表中时,我有重复的值检查,这些情况不在我的担心之列。 –

+0

还有一件事,问题出现在我们的testin数据库中,运行Oracle 10g 10.2版。我只是在11g数据库上测试了这种情况,没有任何问题。查询按我的预期运行。我认为这是一个用11g修复的bug。 –

回答

0

我得到你的最后一个查询两行如预期:

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 
+0

感谢您的回答。正如我在评论中提到的那样,我认为这是Oracle的一个bug。问题发生在我们的测试数据库中,运行Oracle 10g 10.2版。我只是在11g数据库上测试了这种情况,没有任何问题。查询像我期望的那样运行。我认为这是一个用11g修复的bug。 –

+0

关于你的结构,是的,这也是合乎逻辑的。但是你的结构不符合我的客户真正的要求。我已经解释了这个问题,但实际上,我们使用类似的结构来定义相关的培训。例如,定义如A = B和B = C,C = D和D = E,依此类推。我不能将这些记录分组,因为如果C = D关系被删除,A和E将不再相关。无论如何,我的客户正在使用oracle版本11g,并且我已经在他们的环境中测试过了,运行正常:)感谢您的回答。 –