获取值不是另一行中的子字符串的行

时间:2016-03-01 17:43:27

标签: sql recursion substring

我正在针对包含循环引用的表编写递归sql。 没问题!我读到你可以构建一个独特的路径来防止无限循环。现在我需要将列表过滤到链中的最后一条记录。我必须做错事。 -edit我正在为此示例添加更多记录,以便更清楚地说明为什么选择最长记录不起作用。

这是一个示例表:

create table strings (id int, string varchar(200));
insert into strings values (1, '1');
insert into strings values (2, '1,2');
insert into strings values (3, '1,2,3');
insert into strings values (4, '1,2,3,4');
insert into strings values (5, '5');

我的疑问:

select * from strings str1 where not exists
(
  select * from strings str2
  where str2.id <> str1.id
  and str1.string || '%' like str2.string
)

我希望只获得最后的记录

| id |  string |
|----|---------|
|  4 | 1,2,3,4 |
|  5 |       5 |

相反,我得到了所有

| id |  string |
|----|---------|
|  1 |       1 |
|  2 |     1,2 |
|  3 |   1,2,3 |
|  4 | 1,2,3,4 |
|  5 |       5 |

链接到sql小提琴:http://sqlfiddle.com/#!15/7a974/1

1 个答案:

答案 0 :(得分:0)

我的问题在于'LIKE'比较。

select * from  strings str1
where not exists 
(
    select 
      *
    from   
      strings str2
    where  
      str2.id <> str1.id
      and str2.string like str1.string || '%'
)