为什么这个Sql语句'顺序'不正确

时间:2011-04-21 09:48:53

标签: sql group-by sql-order-by

我有sql:

SELECT t.TagText, COUNT(*) AS NumVidsWithTag 
FROM tbl_Tag t
INNER JOIN tbl_Video_Tag_Xref x ON t.TagId=x.TagId
INNER JOIN tbl_Video v ON x.VideoId=v.VideoId
WHERE 6 IS NULL OR EXISTS (SELECT * FROM tbl_Video_Tag_Xref WHERE VideoId=6 AND TagId=t.TagId) 
GROUP BY t.TagText 

返回:

1   1
10  1
11  1
12  1
13  1
14  1
15  1
16  1
17  1
18  1
19  1
2   1
20  1

然后我将sql更改为

SELECT t.TagText, COUNT(*) AS NumVidsWithTag 
FROM tbl_Tag t
INNER JOIN tbl_Video_Tag_Xref x ON t.TagId=x.TagId
INNER JOIN tbl_Video v ON x.VideoId=v.VideoId
WHERE 6 IS NULL OR EXISTS (SELECT * FROM tbl_Video_Tag_Xref WHERE VideoId=6 AND TagId=t.TagId) 
GROUP BY t.TagText 
ORDER BY t.TagText ASC

它仍然以:

1   1
10  1
11  1
12  1
13  1
14  1
15  1
16  1
17  1
18  1
19  1
2   1
20  1

我很困惑为什么这不合适?

7 个答案:

答案 0 :(得分:4)

排序正确。

TagText是一个字符串,因此“11”小于'“2”,例如

要以数字方式对其进行排序,请将您的ORDER BY更改为

ORDER BY CONVERT(INT, t.TagText) ASC

答案 1 :(得分:2)

看起来TagText是一个varchar字段,而不是一个数字。 SQL将根据文本排序规则对varchar字段进行排序 - Aa出现在B之前,因此19出现在2之前。

答案 2 :(得分:2)

假设tbl_Tag.TagText列数据类型为varchar或类似内容。

在这种情况下,这是正确排序 - 按字母顺序排序,19在2之前排序;并且100将在11之前出现。

您需要将数据类型更改为数字类型。

您可以在不更改表格架构的情况下执行此操作:

SELECT t.TagText, COUNT(*) AS NumVidsWithTag 
FROM tbl_Tag tINNER JOIN tbl_Video_Tag_Xref x ON t.TagId=x.TagId
    INNER JOIN tbl_Video v ON x.VideoId=v.VideoId
WHERE 6 IS NULL OR EXISTS (SELECT * FROM tbl_Video_Tag_Xref WHERE VideoId=6 AND TagId=t.TagId) 
GROUP BY t.TagText 
ORDER BY CONVERT(int, t.TagText) ASC

基本上,只需更改ORDER BY子句即可将TagText列转换为int类型

答案 3 :(得分:2)

TagText是一个字符字段(nvarchar?),并按字母顺序排序。

您需要将其转换为数字格式才能进行排序。

SELECT t.TagText, COUNT(*) AS NumVidsWithTag 
FROM tbl_Tag t
INNER JOIN tbl_Video_Tag_Xref x ON t.TagId=x.TagId
INNER JOIN tbl_Video v ON x.VideoId=v.VideoIdWHERE 6 IS NULL OR EXISTS (SELECT * FROM tbl_Video_Tag_Xref 
WHERE VideoId=6 AND TagId=t.TagId) 
GROUP BY t.TagText ORDER BY CONVERT(INT, t.TagText) ASC

答案 4 :(得分:1)

这就是为什么因为列的数据类型不是integer。它是字符串并按字符串排序。

因此2来自19

可能的解决方案是:将列的数据类型更改为integer

答案 5 :(得分:1)

我假设t.TagText是一个字符字段?订单将使用此字段的ASCII值进行排序。上面的排序顺序是正确的。

答案 6 :(得分:1)

我认为它的排序错误,因为order列是一个文本(varchar / nvarchar)。尝试转换为sql的select部分中的int。

如果需要,

转换/转换帮助 http://msdn.microsoft.com/en-us/library/ms187928.aspx