我的查询结果有5行,我想知道它是否可以将整行从一个位置移动到另一个位置。例如第三行到第一行。
下面是我的sql代码:
DECLARE @ClientID int = 1041
DECLARE @ProfileID int =2520
DECLARE @PageType tinyint = 2
BEGIN
WITH SortedList
AS (
SELECT PageID, PageName, PageTitle, PageUrl, ParentID,
CAST((PageName) AS VARCHAR(1000)) AS "Path"
FROM Pagelist p
WHERE p.ParentId IS NULL and p.PageType=@PageType
UNION ALL
SELECT p.PageID, p.PageName, p.PageTitle, p.PageUrl, p.ParentID,
CAST((a.path + '/' + p.PageName) AS VARCHAR(1000)) AS "Path"
FROM Pagelist AS p
JOIN SortedList AS a
ON p.ParentID = a.PageID
WHERE p.PageType=@PageType
)
SELECT a.PageID,a.PageTitle,a.ParentID,ua.Access,a.Path,a.PageName
FROM SortedList as a,ProfilePageAccess ua,UserProfile up
WHERE ua.ClientID=@ClientID and ua.PageID=a.PageID
and up.ProfileID=ua.ProfileID and up.ProfileID=@ProfileID
ORDER BY a.Path
END
我希望能够将第三行移动到第一行。
这是我目前的结果
PAGEID PAGETITLE PARENTID ACCESS PATH PAGENAME
001R Administration 801 2 HRAdmin HrAdmin
002R Performance 802 2 HRAdmin/AdminPer AdminPer
003R Overall Ratings 803 2 HRAdmin/AdminPerformance Perform
004R Score Ratings 804 2 HRAdmin/AdminPerformance Perform
005R Template Setup 805 2 HRAdmin/AdminPerformance Perform
答案 0 :(得分:0)
在您的订购单中,您有:ORDER BY a.Path
这是由a.Path按升序(按字母顺序)排序。
如果您想按其他列的特定值进行排序,可以使用带有ORDER BY
声明的CASE
。
离。
...
SELECT a.PageID,a.PageTitle,a.ParentID,ua.Access,a.Path,a.PageName
FROM SortedList as a,ProfilePageAccess ua,UserProfile up
WHERE ua.ClientID=@ClientID and ua.PageID=a.PageID
and up.ProfileID=ua.ProfileID and up.ProfileID=@ProfileID
ORDER BY CASE a.PageTitle
WHEN 'Overall Ratings' THEN 1
WHEN 'Score Ratings' THEN 2
ELSE 3
END
答案 1 :(得分:0)
一种方法是将ORDER BY更改为更复杂的内容。例如,在Postgres中,您可以从
更改查询 SELECT a.PageID,a.PageTitle,a.ParentID,ua.Access,a.Path,a.PageName
到
SELECT a.PageID,a.PageTitle,a.ParentID,ua.Access,a.Path,a.PageName, a.PageID == '003R' as priority_column
并更改
ORDER BY a.Path
到
ORDER BY priority_column DESC, a.Path
然后它会对结果进行排序,使得priority_column为true
的所有行都位于priority_column为false
的所有行之上。