代码之家  ›  专栏  ›  技术社区  ›  Cymro

MySQL Lead函数返回NULL

  •  -3
  • Cymro  · 技术社区  · 1 年前

    我有这个MySQL表:

    身份证件 名称
    1. 西班牙的
    2. 法语
    3. 德国的

    我使用以下语句:

    SELECT id, Name, Lead(Name) OVER (ORDER BY id) AS 'next' from MyTable WHERE Name='French'
    

    预期结果是:

    身份证件 名称 下一个
    2. 法语 德国的

    结果是:

    身份证件 名称 下一个
    2. 法语 (空)
    1 回复  |  直到 1 年前
        1
  •  2
  •   Lex W.    1 年前

    我不是SQL专家,但这很有效:

    With e AS (
        SELECT id, Name, Lead(Name) OVER (ORDER BY id) AS 'next' from MyTable 
    ) SELECT Id, Name, next FROM e WHERE Name='French'
    

    可能有更有效的解决方案,但由于该表是关于语言的,我不希望它包含数百万条记录。因此,我认为性能几乎不会成为问题。

    编辑 这段代码也做了同样的事情,我想它对大表来说确实更高效,因为它不会首先计算整个表的所有“next”字段:

    SELECT d.*, e.Next
        FROM MyTable d OUTER APPLY
        (SELECT TOP(1) Name AS Next
        FROM Mytable e 
        WHERE e.Id > d.Id
        ORDER BY Id
        ) AS e 
        WHERE d.Name = 'French'