2011-04-21 32 views
0

我有SQL:爲什麼 '由序' 慣於此SQL statament正確

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 

我很困惑,爲什麼這不會正確排序?

+0

p.s video id只是一個被替換的paramteer! – Exitos 2011-04-21 09:49:55

+0

爲什麼名稱是「TagText」而不是「TagNumber」? :) – 2011-04-21 10:12:09

回答

4

它是正確排序。

標記文本是一個字符串,所以「11」是「小於」「2」,例如

要根據數字進行排序它,改變你的ORDER BY到

ORDER BY CONVERT(INT, t.TagText) ASC 
2

看起來像TagText是一個varchar字段,而不是一個數字。 SQL將根據排序文本的規則來排序varchar字段--Aa在B之前,因此19之前出現2.

1

這是爲什麼因爲列的數據類型不是integer。它是字符串並按字符串排序。

因此2來後19

可能的解決辦法是:改變你列的數據類型integer

1

我認爲t.TagText是一個字符型字段?訂單將使用該字段的ASCII值進行排序。上面的排序順序是正確的。

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子句的標記文本列轉換爲鍵入int

2

標記文本轉換這裏幫助是一個字符型字段(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