假设我有一个表,其文本主键名为“名称”。给定一个名称(可以包含任何包含%的任意字符),我需要该表中所有以该名称开头,比该名称更长,并且不以该表中其他任何内容开头的行比给定的名字。
例如,假设我的表包含名称ad
,add
,adder
和adage
。如果我查询“广告的子代”,我想返回add
,adage
。 (adder
是add
的子级)。我有几百万行,可以有效地完成吗?递归查询当然可用。
目前,我有另一种方法来维护“父”列。维护该专栏的代码非常痛苦,并且如果这种其他方法合理的话,那将是不必要的。
最佳答案
我不能说出它的效率,但我认为它有效:
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/