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

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 

@ 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 

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

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ᵀᴹ
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.