Próbuję napisać zapytanie w następujący sposób:
select *
from tbl
where
col1 = 1
and col2 = 2
and col3 = 3
order by
...
;
Chcę najpierw wszystkie wyniki, w których WHERE
pasują wszystkie 3 warunki (3/3), następnie wszystkie wyniki, w których pasują dowolne 2 warunki (2/3), a na końcu wyniki, w których pasuje jeden warunek (1/3).
Każdy z tych 3 zestawów wyników musi być uporządkowany według (col4, col5, col6)
.
Czy mogę to zrobić za pomocą jednego zapytania?
Na przykład:
próbka http://img708.imageshack.us/img708/1646/sampletableresult1.jpg
Skrypt do tworzenia danych testowych:
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
Odpowiedzi:
lub w przypadku MS-Access:
źródło
IIF(col1 = 1,1,0) +IIF(col2 = 2,1,0) +IIF(col3 = 3,1,0) desc
Czy to osiągnie to, czego chcesz? Technicznie widok wbudowany nie jest konieczny, ponieważ można by powtórzyć instrukcję case w kolejności wg.
źródło
źródło
(col1,col2,col3)
=(1,0,0)
(1 dopasowanie) przed wierszem z(0,2,3)
(2 dopasowania).