Consulte as melhores correspondências possíveis e encomende-as

9

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 três WHEREcondições correspondam (3/3), depois todos os resultados em que duas condições correspondam (2/3) e, finalmente, os resultados em que qualquer condição 1 corresponda (1/3).

Cada um desses três conjuntos de resultados precisa ser solicitado 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
forX
fonte
se possível sem 3! juntar-se a amostra tem 3 primeira col, mas, na realidade, a sua mais do que isso
forX
Portanto, você deseja encontrar todas as linhas nas quais todas as três condições correspondem, as duas condições e a condição 1 e reunir todos os resultados, classificados por col4, 5 e 6. Isso está correto?
Nick Chammas
sim, eu sei, eu estava procurando uma outra maneira, porque é mais do que 3 col
forX
11
bem, para o momento o seu acesso (eu estou esperando para obter o meu db sql server)
forX
3
Se você eventualmente usar o SQL Server, instale a edição expressa . Caminho de atualização limpo para uma versão paga pela versão e sem lidar com idiossincrasias de sintaxe no Access.
Mark-Storey-Smith #

Respostas:

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 

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 
ypercubeᵀᴹ
fonte
@ Mark: Que combinações você quer dizer? Você pode dar um exemplo?
precisa saber é o seguinte
@ypercube Admito, +1 :)
Mark Storey-Smith
@ Mark: thnx, eu estava começando a me preocupar por não ter entendido a pergunta.
precisa saber é o seguinte
parece bom, mas agora estou no estoque com acesso db e tento fazer isso, e não recebo o bom resultado (SELECIONAR col1, col2, col3, col4, col4, col5, col6 FROM mytable WHERE col1 = 1 OU col2 = 2 OU col3 = 3 ORDEM POR IIF (col1 = 1,1,0) + IIF (col2 = 1,1,0) + IIF (col3 = 1,1,0) desc, col4, col5, col6)
forX
Modificação pequena:IIF(col1 = 1,1,0) +IIF(col2 = 2,1,0) +IIF(col3 = 3,1,0) desc
ypercubeOff:
1

Isso alcançaria o que você deseja? Tecnicamente, a visualização embutida não é necessária, pois você pode repetir a instrução de caso na ordem de.

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 
Grumoso
fonte
11
E se col1 e col3 corresponderem? Ou apenas col2? O OP está procurando por todas as três partidas, duas partidas e qualquer uma delas .
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
Praveen Prasannan
fonte
Não, esta consulta ordenará a linha com (col1,col2,col3)= (1,0,0)(1 correspondência) antes da linha com (0,2,3)(2 correspondências).
precisa saber é o seguinte