将整行从一个位置移动到另一个位置

时间:2017-12-04 20:01:05

标签: sql

我的查询结果有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

2 个答案:

答案 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的所有行之上。

编辑:Zorkolot的答案比这更清晰;可能与那个一起去。