sql - 根据前置条件对 SQL 结果进行排序

标签 sql informix

我的数据库中有下表:

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

我想要一个选择 namevalue 的 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/

相关文章:

asp.net - 如何将数据从 SQL Server 传输到 Informix,反之亦然

php - PDO 连接字符串 : What is the best way to do it?

sql - 如何在 Oracle SQL 中显示索引

mysql - 选择多位零

sql - 安装脚本MySQL语法错误 "You have an error in your SQL syntax; [...] "

sql - 为什么这个 LEFT JOIN 运行缓慢?

python - 在 Centos 上使用 pyodbc 连接到 Informix

php pdo informix 以字符串或 NULL 形式返回数据

java - Informix JDBC 准备语句 UPDATE 多重集

java - Informix for mysql now() 中的替换函数是什么