Consultar las mejores coincidencias posibles y ordenarlas

9

Estoy tratando de escribir una consulta a lo largo de estas líneas:

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

Quiero primero todos los resultados donde WHEREcoincidan las 3 condiciones (3/3), luego todos los resultados donde coincidan 2 condiciones (2/3), y finalmente los resultados donde coincida cualquier condición 1 (1/3).

Cada uno de estos 3 conjuntos de resultados debe ordenarse por (col4, col5, col6).

¿Puedo hacer eso en una sola consulta?

Por ejemplo:

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

Script para crear datos de prueba:

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
fuente
si es posible sin 3! unirse a la muestra tiene 3 primeros col, pero en realidad, es más que eso
X
Por lo tanto, desea encontrar todas las filas donde coincidan las 3 condiciones, luego donde coincidan 2 condiciones, luego donde coincida cualquier condición 1 y juntar todos los resultados, ordenados por col4, 5 y 6. ¿Es correcto?
Nick Chammas
sí, lo sé, estaba buscando otra manera, porque son más de 3 col
X
1
bueno, por el momento es su acceso (estoy esperando obtener mi servidor SQL DB)
forX
3
Si finalmente utilizará SQL Server, instale la edición express . Ruta de actualización limpia a una versión paga y sin tener que lidiar con idiosincrasias de sintaxis en Access.
Mark Storey-Smith

Respuestas:

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 

o, 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ᵀᴹ
fuente
@ Mark: ¿Qué combinaciones quieres decir? ¿Puede dar un ejemplo?
ypercubeᵀᴹ
@ypercube Lo reconozco, +1 :)
Mark Storey-Smith
@ Mark: gracias, estaba empezando a preocuparme de no haber entendido la pregunta.
ypercubeᵀᴹ
parece bueno, pero ahora tengo existencias con acceso db, y lo intento, y no obtengo el buen resultado (SELECCIONE col1, col2, col3, col4, col5, col6 DESDE mytable DONDE col1 = 1 O col2 = 2 O col3 = 3 ORDEN POR IIF (col1 = 1,1,0) + IIF (col2 = 1,1,0) + IIF (col3 = 1,1,0) desc, col4, col5, col6)
forX
Pequeña modificación:IIF(col1 = 1,1,0) +IIF(col2 = 2,1,0) +IIF(col3 = 3,1,0) desc
ypercubeᵀᴹ
1

¿Esto lograría lo que quieres? Técnicamente, la vista en línea no es necesaria, ya que podría repetir la declaración del caso en el orden por.

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 
Aterronado
fuente
1
¿Qué pasa si col1 y col3 coinciden? O simplemente col2? El OP está buscando las 3 coincidencias, dos coincidencias, cualquiera coincide.
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
fuente
No, esta consulta ordenará la fila con (col1,col2,col3)= (1,0,0)(1 coincidencia) antes de la fila con (0,2,3)(2 coincidencias).
ypercubeᵀᴹ