for*_*orX 9 ms-access query order-by
我正在尝试按照以下方式编写查询:
select *
from tbl
where
col1 = 1
and col2 = 2
and col3 = 3
order by
...
;
Run Code Online (Sandbox Code Playgroud)
我首先想要所有 3 个WHERE
条件匹配的所有结果(3/3),然后是任何 2 个条件匹配的所有结果(2/3),最后是任何 1 个条件匹配的结果(1/3)。
这 3 个结果集中的每一个都需要按 排序(col4, col5, col6)
。
我可以在单个查询中做到这一点吗?
例如:
示例 http://img708.imageshack.us/img708/1646/sampletableresult1.jpg
创建测试数据的脚本:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[MyTable]') AND type in (N'U'))
DROP TABLE [dbo].[MyTable]
GO
CREATE TABLE dbo.MyTable
(
col1 INT
, col2 INT
, col3 INT
, col4 INT
, col5 INT
, col6 INT
)
GO
INSERT dbo.MyTable (col1, col2, col3, col4, col5, col6)
SELECT 1,2,3,2,1,1 UNION ALL
SELECT 1,2,30,1,1,1 UNION ALL SELECT 1,20,30,1,1,1 UNION ALL
SELECT 10,20,3,1,1,1 UNION ALL SELECT 10,2,30,1,1,1 UNION ALL
SELECT 10,2,3,1,1,1 UNION ALL SELECT 10,20,30,1,1,1 UNION ALL
SELECT 1,2,3,1,1,1 UNION ALL SELECT 1,2,3,1,2,2 UNION ALL
SELECT 1,2,3,1,2,3 UNION ALL SELECT 1,20,3,1,1,1
GO
Run Code Online (Sandbox Code Playgroud)
SELECT col1,
col2,
col3,
col4,
col5,
col6
FROM TableX
WHERE col1 = 1
OR col2 = 2
OR col3 = 3
ORDER BY (CASE WHEN col1 = 1 THEN 1 ELSE 0 END) +
(CASE WHEN col2 = 2 THEN 1 ELSE 0 END) +
(CASE WHEN col3 = 3 THEN 1 ELSE 0 END) DESC,
col4, col5, col6
Run Code Online (Sandbox Code Playgroud)
或者,对于 MS-Access:
ORDER BY IIF(col1 = 1,1,0) +
IIF(col2 = 2,1,0) +
IIF(col3 = 3,1,0) DESC,
col4, col5, col6
Run Code Online (Sandbox Code Playgroud)