查询最佳匹配项并对其进行排序

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)

ype*_*eᵀᴹ 7

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)