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 WHERE
condiçõ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
Respostas:
ou, para MS-Access:
fonte
IIF(col1 = 1,1,0) +IIF(col2 = 2,1,0) +IIF(col3 = 3,1,0) desc
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.
fonte
fonte
(col1,col2,col3)
=(1,0,0)
(1 correspondência) antes da linha com(0,2,3)
(2 correspondências).