Почему это заявление Sql 'order by' правильно - PullRequest
0 голосов
/ 21 апреля 2011

У меня есть 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 ]

4 голосов
/ 21 апреля 2011

отсортировано правильно

TagText является строкой, поэтому «11» меньше, чем «2», например

Чтобы отсортировать численно, измените ваш ORDER BY на

ORDER BY CONVERT(INT, t.TagText) ASC
2 голосов
/ 21 апреля 2011

TagText является символьным полем (nvarchar?) И сортируется в алфавитно-цифровом порядке.

Вам потребуется преобразовать его в числовой формат для сортировки.

2 голосов
/ 21 апреля 2011

Предположительно 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

2 голосов
/ 21 апреля 2011

Похоже, TagText - это поле типа varchar, а не число. SQL упорядочит поля varchar на основе правил сортировки текста - Aa предшествует B, поэтому 19 предшествует 2.

1 голос
/ 21 апреля 2011

Я считаю, что это неправильный порядок, потому что столбец заказа - это текст (varchar / nvarchar). Попробуйте преобразовать в int в секции select sql.

Приведение / преобразование справки здесь при необходимости http://msdn.microsoft.com/en-us/library/ms187928.aspx

1 голос
/ 21 апреля 2011

Я предполагаю, что t.TagText является символьным полем? Порядок будет отсортирован с использованием значений ASCII этого поля. Вышеуказанный порядок сортировки правильный.

1 голос
/ 21 апреля 2011

Вот почему из-за типа данных столбца не integer. это строка и сортируется как строка.

следовательно 2 следует после 19

Возможное решение: измените тип данных вашего столбца на integer

...