AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 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

Consultar as melhores correspondências possíveis e ordená-las

  • 772

Estou tentando escrever uma consulta ao longo destas linhas:

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

Quero primeiro todos os resultados em que todas as 3 WHEREcondições correspondam (3/3), depois todos os resultados em que quaisquer 2 condições correspondam (2/3) e, finalmente, os resultados em que qualquer 1 condição corresponda (1/3).

Cada um desses 3 conjuntos de resultados precisa ser ordenado por (col4, col5, col6).

Posso fazer isso em uma única consulta?

Por exemplo:

amostra http://img708.imageshack.us/img708/1646/sampletableresult1.jpg

Script para criar dados de teste:

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 respostas
  • 3805 Views

3 respostas

  • 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 
    

    ou, para 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

    Isso alcançaria o que você deseja? Tecnicamente, a exibição em linha não é necessária, pois você pode repetir a instrução case no pedido.

    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

relate perguntas

  • Usando uma consulta de parâmetro para gerar gráficos em relatórios do MS Access

  • Consulta entre duas tabelas relacionadas

  • Alinhamento de data e extração de par correspondente melhor feito com TSQL ou C #?

  • LIKE para selecionar a existência independente da palavra em qualquer parte do texto

  • Consultar o banco de dados Linked Access no compartilhamento de rede via SQL Job Agent

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

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

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve