sql - 我需要一个查询以我的名字开头但不以该名字开头的 child

标签 sql sqlite

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

例如,假设我的表包含名称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/

相关文章:

sql - 有条件的 where 子句导致 Firebird 的性能很差

php - JQuery Full Calendar 使用 PHP 限制事件

ios - Objective C "unable to open database file"在循环 SQLite 中插入大量数据时

ios - 想给Sqlite数据库添加上标数据

java - 为什么我无法更新sqlite数据库的值

sql - BigQuery 标准 SQL 查询返回错误答案

sql - sql查询中如何对一个字段中的多个字段求和?

sql - 如果结果为 true,则返回列名称

android - 如何在Sqlite Android中加密数据和存储

mysql - 按一年中的周查找 ActiveRecord 对象