Recherchez les meilleures correspondances possibles et commandez-les

9

J'essaie d'écrire une requête dans ce sens:

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

Je veux d'abord tous les résultats où les 3 WHEREconditions correspondent (3/3), puis tous les résultats où 2 conditions correspondent (2/3), et enfin les résultats où 1 condition correspond (1/3).

Chacun de ces 3 jeux de résultats doit être commandé par (col4, col5, col6).

Puis-je le faire en une seule requête?

Par exemple:

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

Script pour créer des données de 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
forX
la source
si possible sans 3! rejoindre l'échantillon ont 3 premiers col, mais en réalité, c'est plus que cela
forX
Donc, vous voulez trouver toutes les lignes où les 3 conditions correspondent, puis où 2 conditions correspondent, puis où 1 condition correspond et regrouper tous les résultats, triés par col4, 5 et 6. Est-ce correct?
Nick Chammas
ouais, je sais, je cherchais une autre façon, parce que son plus de 3 col
forX
1
eh bien, pour le moment son accès (j'attends d'avoir ma base de données SQL Server)
forX
3
Si vous allez éventuellement utiliser SQL Server, installez l' édition express . Nettoyer le chemin de mise à niveau vers une version payante et ne pas traiter les idiosyncrasies de syntaxe dans Access.
Mark Storey-Smith,

Réponses:

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 

ou, pour MS-Access:

ORDER BY IIF(col1 = 1,1,0) +
         IIF(col2 = 2,1,0) +
         IIF(col3 = 3,1,0) DESC,
         col4, col5, col6 
ypercubeᵀᴹ
la source
@Mark: Quelles combinaisons voulez-vous dire? Pouvez-vous donner un exemple?
ypercubeᵀᴹ
@ypercube Je concède, +1 :)
Mark Storey-Smith
@Mark: thnx, je commençais à m'inquiéter de ne pas avoir compris la question.
ypercubeᵀᴹ
semble bon, mais je suis maintenant en stock avec accès db, et j'essaye, et je n'obtiens pas le bon résultat (SELECT col1, col2, col3, col4, col5, col6 FROM mytable WHERE col1 = 1 OR col2 = 2 OR col3 = 3 ORDER BY IIF (col1 = 1,1,0) + IIF (col2 = 1,1,0) + IIF (col3 = 1,1,0) desc, col4, col5, col6)
forX
Petite modification:IIF(col1 = 1,1,0) +IIF(col2 = 2,1,0) +IIF(col3 = 3,1,0) desc
ypercubeᵀᴹ
1

Cela permettrait-il d'atteindre ce que vous voulez? Techniquement, la vue en ligne n'est pas nécessaire car vous pouvez répéter la déclaration de cas dans l'ordre par.

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 
Grumeleux
la source
1
Et si col1 et col3 correspondent? Ou tout simplement col2? L'OP recherche les 3 correspondances, deux correspondances, toutes les correspondances.
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
la source
Non, cette requête ordonne la ligne avec (col1,col2,col3)= (1,0,0)(1 correspondance) avant la ligne avec (0,2,3)(2 correspondances).
ypercubeᵀᴹ