我的数据库中有下表:
create table (
name varchar(25),
value int,
predecessor varchar(25)
);
带有示例数据:
name | value | predecessor
---------------+-------+---------------
buyingredients | 10 | null
eat | 3 | cook
cook | 12 | mixingredients
mixingredients | 5 | buyingredients
我想要一个选择 name
和 value
的 SQL 查询,顺序是先行为 null
的项目,然后是谁的前任行等于该行的名称是下一个,依此类推(即购买配料、混合配料、 cooking 、食用)。
排序是严格线性的 - 如果两行具有相同的前导值,则行为未定义。
我正在努力寻找能够生成我想要的顺序的 SQL 查询。我真的不知道从哪里开始。
我使用的是 Informix 数据库,尽管 SQL 的任何变体都是有用的起点。
已更新以反射(reflect)排序不是按字母顺序排列的事实
最佳答案
在具有公共(public)表表达式的 Transact-SQL 中:
WITH LinkedList (name, value, predecessor, ordering)
AS
(
SELECT a.name, a.value, a.predecessor, 0
FROM YourTable a
WHERE a.predecessor IS NULL
UNION ALL
SELECT b.name, b.value, b.predecessor, c.ordering + 1
FROM YourTable b
INNER JOIN LinkedList c
ON b.predecessor = c.name
)
SELECT d.name, d.value
FROM LinkedList d
ORDER BY d.ordering, d.name
我不知道 Informix 是否有这个结构,但你问的本质上是一个递归查询,在 Transact-SQL 中常见的表表达式给你。
关于sql - 根据前置条件对 SQL 结果进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6297596/