AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 7537
Accepted
forX
forX
Asked: 2011-11-03 11:38:52 +0800 CST2011-11-03 11:38:52 +0800 CST 2011-11-03 11:38:52 +0800 CST

查询最佳匹配并排序

  • 772

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

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
ms-access query
  • 3 3 个回答
  • 3805 Views

3 个回答

  • Voted
  1. Best Answer
    ypercubeᵀᴹ
    2011-11-03T13:22:52+08:002011-11-03T13:22:52+08:00
    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 
    
    • 8
  2. Lumpy
    2011-11-03T12:57:50+08:002011-11-03T12:57:50+08:00

    这会达到你想要的吗?从技术上讲,内联视图不是必需的,因为您可以按顺序重复 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
  3. Praveen Prasannan
    2011-11-04T02:16:06+08:002011-11-04T02:16:06+08:00
    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
    
    • 1

相关问题

  • 使用参数查询在 MS Access 报告中生成图表

  • 两个相关表之间的查询

  • 日期对齐和对匹配提取最好用 TSQL 或 C# 完成?

  • LIKE 选择文字中任意位置独立存在的单词

  • 通过 SQL Job Agent 查询网络共享上的 Linked Access 数据库

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve