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

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 

@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 

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

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ᵀᴹ
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.