假设我有一个表,其文本主键名为“名称”。给定一个名称(可以包含任何包含%的任意字符),我需要该表中所有以该名称开头,比该名称更长,并且不以该表中其他任何内容开头的行比给定的名字。

例如,假设我的表包含名称adaddadderadage。如果我查询“广告的子代”,我想返回addadage。 (adderadd的子级)。我有几百万行,可以有效地完成吗?递归查询当然可用。

目前,我有另一种方法来维护“父”列。维护该专栏的代码非常痛苦,并且如果这种其他方法合理的话,那将是不必要的。

最佳答案

我不能说出它的效率,但我认为它有效:

with cte as (
  select name
  from tablename
  where name like 'ad' || '_%'
)
select c.name
from cte c
where not exists (
  select 1 from cte
  where c.name like name || '_%'
);


请参见demo
等同于上述带有自我LEFT JOIN的查询:

with cte as (
  select name
  from tablename
  where name like 'ad' || '_%'
)
select c.name
from cte c left join cte cc
on c.name like cc.name || '_%'
where cc.name is null


请参见demo
结果:

| name  |
| ----- |
| add   |
| adage |

关于sql - 我需要一个查询以我的名字开头但不以该名字开头的 child ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58754664/

10-12 21:23