Zapytaj najlepsze możliwe dopasowania i zamów je

9

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 WHEREpasują 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
forX
źródło
jeśli to możliwe bez 3! dołącz do próbki mają 3 pierwsze kolumny, ale w rzeczywistości jest ich więcej
forX
Więc chcesz znaleźć wszystkie wiersze, w których pasują wszystkie 3 warunki, a następnie, gdzie pasują dowolne 2 warunki, a następnie, gdzie pasuje jeden warunek i zsumuj wszystkie wyniki, posortowane według kolumn 4, 5 i 6. Czy to prawda?
Nick Chammas,
tak, wiem, szukałem innej drogi, ponieważ jest to więcej niż 3
kolumny
1
cóż, na razie jego dostęp (czekam, aby uzyskać db db serwera SQL)
forX
3
Jeśli ostatecznie będziesz używać programu SQL Server, zainstaluj wersję ekspresową . Czysta ścieżka aktualizacji do wersji płatnej i brak radzenia sobie z osobliwościami składni w programie Access.
Mark Storey-Smith,

Odpowiedzi:

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 

lub w przypadku MS-Access:

ORDER BY IIF(col1 = 1,1,0) +
         IIF(col2 = 2,1,0) +
         IIF(col3 = 3,1,0) DESC,
         col4, col5, col6 
ypercubeᵀᴹ
źródło
@Mark: Jakie kombinacje masz na myśli? Czy możesz podać przykład?
ypercubeᵀᴹ
@ypercube I przyznaję, +1 :)
Mark Storey-Smith
@ Mark: dzięki, zacząłem się martwić, że nie zrozumiałem pytania.
ypercubeᵀᴹ
wydaje się dobry, ale mam teraz dostęp do bazy danych dbam i próbuję tego, ale nie otrzymuję dobrego wyniku (WYBIERZ col1, col2, col3, col4, col5, col6 OD mytable GDZIE col1 = 1 LUB col2 = 2 LUB col3 = 3 BY IIF (kol1 = 1,1,0) + IIF (kolumna2 = 1,1,0) + IIF (Col3 = 1,1,0), malejąco, Col4, Col5, Col6)
forX
Mała modyfikacja:IIF(col1 = 1,1,0) +IIF(col2 = 2,1,0) +IIF(col3 = 3,1,0) desc
ypercubeᵀᴹ
1

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.

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 
Grudkowaty
źródło
1
Co jeśli pasują col1 i col3? A może po prostu col2? OP szuka wszystkich 3 meczów, dowolnych dwóch meczów, dowolnych meczów.
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
źródło
Nie, to zapytanie uporządkuje wiersz z (col1,col2,col3)= (1,0,0)(1 dopasowanie) przed wierszem z (0,2,3)(2 dopasowania).
ypercubeᵀᴹ