Предположим, у меня есть таблица Tag
(Id int
и Name nvarchar(100)
) с 3 значениями:
1 Software
2 Hardware
3 Warehouse
Теперь я хочу сделать запрос с ключевым словом и расставить приоритеты для тех, которые начинаются с ключевого слованад вмещающим.Поэтому сначала я пишу этот запрос:
SELECT 0 AS SortCol, *
FROM Tag T
WHERE CHARINDEX(@keyword, T.Name) = 1
UNION
SELECT 1 AS SortCol, *
FROM Tag T
WHERE T.Name LIKE ('%' + @keyword + '%')
ORDER BY SortCol, Name;
Однако это не сработало, потому что столбец SortCol
больше не делает их различимыми (значение Warehouse
появляется дважды, потому что оно верно в обоих случаях).
Вот тогда я думаю, что мне нужно вручную вызвать DISTINCT
, избавившись от этого столбца:
SELECT DISTINCT T2.Id, T2.Name
FROM
(SELECT 0 AS SortCol, *
FROM Tag T
WHERE CHARINDEX(@keyword, T.Name) = 1
UNION
SELECT 1 AS SortCol, *
FROM Tag T
WHERE T.Name LIKE ('%' + @keyword + '%')
ORDER BY SortCol, T.Name) AS T2;
Однако,это не работает, потому что я получаю эту ошибку:
Предложение ORDER BY недопустимо в представлениях, встроенных функциях, производных таблицах, подзапросах и выражениях общих таблиц, кроме случаев, когда TOP, OFFSET или FOR XML такжеуказано.
Что мне здесь не хватает?Как я могу использовать UNION
с ORDER BY
в обоих утверждениях?