按DIFFERENCE()排序时,MS SQL不返回预期的顶行

时间:2018-02-14 09:11:35

标签: sql sql-server

我注意到在我工作的公司用于地址匹配的一些SQL代码中有奇怪的行为。已经创建了一些测试SQL来说明问题。

; WITH Temp (Id, Diff) AS (

    SELECT 9218, 0
    UNION
    SELECT 9219, 0
    UNION
    SELECT 9220, 0

)

SELECT TOP 1 * FROM Temp ORDER BY Diff DESC

返回 9218 ,但

; WITH Temp (Id, Name) AS (

    SELECT 9218, 'Sonnedal'
    UNION
    SELECT 9219, 'Lammermoor'
    UNION
    SELECT 9220, 'Honeydew'

)

SELECT TOP 1 *, DIFFERENCE(Name, '')  FROM Temp ORDER BY DIFFERENCE(Name, '') DESC

返回 9219 ,即使所有记录的差异()为0,您可以在此处看到:

; WITH Temp (Id, Name) AS (

    SELECT 9218, 'Sonnedal'
    UNION
    SELECT 9219, 'Lammermoor'
    UNION
    SELECT 9220, 'Honeydew'

)

SELECT  *, DIFFERENCE(Name, '')  FROM Temp ORDER BY DIFFERENCE(Name, '') DESC

返回

9218    Sonnedal    0
9219    Lammermoor  0
9220    Honeydew    0

有谁知道为什么会这样?我正在编写C#来替换现有的SQL&需要返回相同的结果,以便我可以测试我的代码产生相同的结果。但我不明白为什么实际使用的SQL返回9219而不是9218&它似乎没有意义。它似乎属于Difference()函数,但它对所有相关记录都返回0。

1 个答案:

答案 0 :(得分:3)

致电时:

SELECT TOP 1 *, DIFFERENCE(Name, '')
FROM Temp l
ORDER BY DIFFERENCE(Name, '') DESC

所有三个记录的DIFFERENCE值均为零,因此SQL Server可以自由选择三个记录中的任何进行排序。也就是说,无法保证您将获得哪个订单。第二个查询也是如此。实际上,同一查询的排序甚至可能随着时间的推移而变化。实际上,如果你期望某种顺序,你应该为它提供准确的逻辑,例如

SELECT TOP 1 *
FROM Temp
ORDER BY Id;