查询最佳匹配并排序


9

我正在尝试按照以下方式编写查询:

select * 
from tbl 
where 
       col1 = 1 
   and col2 = 2 
   and col3 = 3
order by
   ...
;

我首先要获得所有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

如果可能的话不加3!加入样本的人拥有3个第一栏,但实际上,它的数量更多
forX

因此,您要查找所有3个条件都匹配的所有行,然后找到2个条件都匹配的行,然后找到1个条件都匹配的行,并将所有结果放在一起,按col4、5和6排序。这是正确的吗?
Nick Chammas

是的,我知道,我在寻找另一种方法,因为它的长度超过3列
forX

1
好吧,目前它的访问权限(我正在等待获取我的sql server数据库)
forX

3
如果最终要使用SQL Server,请安装Express Edition。干净升级到付费版本的升级路径,并且不处理Access中的语法特质。
Mark Storey-Smith

Answers:


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 

或,对于MS-Access:

ORDER BY IIF(col1 = 1,1,0) +
         IIF(col2 = 2,1,0) +
         IIF(col3 = 3,1,0) DESC,
         col4, col5, col6 

@Mark:你的意思是什么组合?你能给个例子吗?
ypercubeᵀᴹ

@ypercube我承认,+ 1 :)
Mark Storey-Smith

@Mark:thnx,我开始担心我不明白这个问题。
ypercubeᵀᴹ

似乎不错,但我现在有访问数据库了,我尝试这样做,但没有得到很好的结果(从mytable那里选择col1,col2,col3,col4,col5,col6,col1 = 1或col2 = 2或col3 = 3 ORDER BY IIF(col1 = 1,1,0)+ IIF(col2 = 1,1,0)+ IIF(col3 = 1,1,0)desc,col4,col5,col6)
forX 2011年

小的修改:IIF(col1 = 1,1,0) +IIF(col2 = 2,1,0) +IIF(col3 = 3,1,0) desc
ypercubeᵀᴹ

1

这样可以实现您想要的吗?从技术上讲,内联视图不是必需的,因为您可以按顺序重复case语句。

select y.col1, 
       y.col2,
       y.col3, 
       y.col4, 
       y.col5, 
       y.col6
from (
      select col1, 
             col2, 
             col3, 
             case when col1 =1 and col2 = 2 and col3 = 3 then
                       1
                  when col1 = 1 and col2 = 2 and col3 <> 3 then
                       2
                  when col1 = 1 then
                       3
                  else 
                       4
             end x,
             col4, 
             col5, 
             col6
       from table
       )y
order by y.x, col4, col5, col6 

1
如果col1和col3匹配怎么办?还是只是col2?OP正在寻找所有3场比赛,任意两场比赛,任意一场比赛。
Nick Chammas

1
SELECT col1,
       col2,
       col3,
       col4,
       col5,
       col6
FROM TableName
WHERE col1 = 1
   OR col2 = 2
   OR col3 = 3
ORDER BY (CASE WHEN col1 = 1 THEN 1 ELSE 0 END) DESC,
         (CASE WHEN col2 = 2 THEN 1 ELSE 0 END) DESC,
         (CASE WHEN col3 = 3 THEN 1 ELSE 0 END) DESC,
         col4, col5, col6

不,此查询将对具有(col1,col2,col3)= (1,0,0)(1个匹配项)的行进行排序,然后将具有(0,2,3)(2个匹配项)的行排序。
ypercubeᵀᴹ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.