Cerca le migliori corrispondenze possibili e ordinale


9

Sto cercando di scrivere una query in questo modo:

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

Voglio prima tutti i risultati in cui tutti e 3 WHERE condizioni corrispondono (3/3), quindi tutti i risultati in cui ogni 2 condizioni corrispondono (2/3) e infine i risultati in cui 1 qualsiasi condizione corrisponde (1/3).

Ognuno di questi 3 set di risultati deve essere ordinato per (col4, col5, col6) .

Posso farlo in una singola query?

Per esempio:

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

Script per creare dati di test:

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

se possibile senza 3! unisciti al campione hanno 3 primi col, ma in realtà è più di questo
perX il

Quindi vuoi trovare tutte le righe in cui corrispondono tutte e 3 le condizioni, quindi dove ogni 2 condizioni corrispondono, quindi dove 1 qualsiasi condizione corrisponde e mettere insieme tutti i risultati, ordinati per col4, 5 e 6. È corretto?
Nick Chammas,

sì, lo so, stavo cercando in un altro modo, perché è più di 3 col
forX il

1
bene, per il momento il suo accesso (sto aspettando di ottenere il mio db server SQL)
forX

3
Se alla fine utilizzerai SQL Server, installa l' edizione express . Ripulisci il percorso di aggiornamento a una versione a pagamento e non gestisci le idiosincrasie della sintassi in Access.
Mark Storey-Smith,

Risposte:


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 

oppure, per MS-Access:

ORDER BY IIF(col1 = 1,1,0) +
         IIF(col2 = 2,1,0) +
         IIF(col3 = 3,1,0) DESC,
         col4, col5, col6 

@Mark: quali combinazioni intendi? Puoi fare un esempio?
ypercubeᵀᴹ

@ypercube concedo, +1 :)
Mark Storey-Smith

@Mark: grazie, stavo iniziando a preoccuparmi di non aver capito la domanda.
ypercubeᵀᴹ

sembra buono, ma ora sono disponibile con accesso db e provo questo, e non ottengo il buon risultato (SELEZIONA col1, col2, col3, col4, col5, col6 DA mytable DOVE col1 = 1 OR col2 = 2 OR col3 = 3 ORDINA PER IIF (col1 = 1,1,0) + IIF (col2 = 1,1,0) + IIF (col3 = 1,1,0) desc, col4, col5, col6)
forX

Piccola modifica:IIF(col1 = 1,1,0) +IIF(col2 = 2,1,0) +IIF(col3 = 3,1,0) desc
ypercubeᵀᴹ

1

Questo raggiungerebbe quello che vuoi? Tecnicamente la vista in linea non è necessaria in quanto è possibile ripetere l'istruzione case nell'ordine.

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
Cosa succede se col1 e col3 corrispondono? O semplicemente col2? L'OP sta cercando tutte e 3 le partite, ogni due partite, una qualsiasi partita.
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, questa query ordinerà la riga con (col1,col2,col3)= (1,0,0)(1 corrispondenza) prima della riga con (0,2,3)(2 corrispondenze).
ypercubeᵀᴹ
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.