按两列排序表

Lil*_*nos 3 sql-server-2008 sql-server order-by

我想订购这张桌子,但我找不到让它工作的方法。你能帮助我吗?

我有这张桌子:

桌子

我需要这个:

另一个

我有一个列出文档的表,第一个字段是文档的 id,第二个字段代表父亲,所以我必须显示一个列表,您可以有序地看到 242 是第一个文档,252 和 335是从 242 生成的。

查询:

select * from table_name order by col1 ASC, Col2 ASC
Run Code Online (Sandbox Code Playgroud)

......对我不起作用。我做这个查询:

SELECT
    FR1.[report_id],
    FR1.[report_parent] 
FROM [FARA_reports] FR1
WHERE
    FR1.[report_is_delete] <> 1 
    AND FR1.[report_is_tmp] <> 1
ORDER BY
    FR1.[report_id] asc, 
    FR1.[report_parent] desc
Run Code Online (Sandbox Code Playgroud)

这是我的第一张图片。

Joe*_*ish 8

您的数据:

CREATE TABLE dbo.WEIRD_ORDERING
(
ID1 INT NULL,
ID2 INT NULL
);

INSERT INTO dbo.WEIRD_ORDERING VALUES
(242, NULL),
(243, NULL),
(244, NULL),
(252, 242),
(254, NULL),
(255, NULL),
(256, NULL),
(292, NULL),
(308, NULL),
(311, NULL),
(313, 311),
(314, 311),
(323, NULL),
(324, 311),
(335, 242),
(340, NULL),
(341, NULL),
(358, NULL),
(372, NULL),
(373, NULL),
(377, NULL),
(378, 358),
(379, 358),
(380, 358),
(381, 358);
Run Code Online (Sandbox Code Playgroud)

这将为您提供所需顺序的结果:

SELECT ID1, ID2
FROM
(
    SELECT ID1, ID2, ID1 AS ORDERING_COLUMN
    FROM dbo.WEIRD_ORDERING
    WHERE ID1 <= ID2 OR ID2 IS NULL

    UNION ALL

    SELECT ID1, ID2, ID2 AS ORDERING_COLUMN
    FROM dbo.WEIRD_ORDERING
    WHERE ID1 > ID2 OR ID1 IS NULL
) q
ORDER BY ORDERING_COLUMN, ID1;
Run Code Online (Sandbox Code Playgroud)

数据库小提琴


ype*_*eᵀᴹ 6

另外一个选项:

select a, b
from t
order by 
    case when a < b or b is null then a else b end,
    case when a < b or b is null then b else a end ;
Run Code Online (Sandbox Code Playgroud)

dbfiddle.uk 中测试。