我注意到在我工作的公司用于地址匹配的一些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。
答案 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;