T-SQL Union(distinct,not all)和Order by优先级

Luk*_* Vo 1 sql t-sql sql-server union sql-order-by

假设我有一个包含3个值的Tag表(Id intName nvarchar(100)):

1 Software
2 Hardware
3 Warehouse
Run Code Online (Sandbox Code Playgroud)

现在我想查询关键字,并优先考虑以关键字开头的那些关键字.所以一开始我写这个查询:

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;
Run Code Online (Sandbox Code Playgroud)

但是这不起作用,因为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;
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用,因为我收到此错误:

除非还指定了TOP,OFFSET或FOR XML,否则ORDER BY子句在视图,内联函数,派生表,子查询和公用表表达式中无效.

我在这里错过了什么?如何我可以用UNIONORDER BY在这两个语句?

Mar*_*ith 5

你不需要UNION你可以使用

SELECT *
FROM   Tag T
WHERE  T.Name LIKE '%' + @keyword + '%'
ORDER  BY CASE WHEN T.Name LIKE @keyword + '%' THEN 0 ELSE 1 END,
          Name; 
Run Code Online (Sandbox Code Playgroud)