1

我有一个在数据库表中存储相等记录的结构。你可以认为这些记录是兄弟。例如我在这张表中有两条记录;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 的结果不同。任何帮助或想法都会被应用。

谢谢。

4

1 回答 1

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
于 2015-01-15T11:30:57.573 回答