Fragen Sie die bestmöglichen Übereinstimmungen ab und bestellen Sie sie

9

Ich versuche, eine Abfrage in diese Richtung zu schreiben:

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

Ich möchte zuerst alle Ergebnisse, bei denen alle 3 WHEREBedingungen übereinstimmen (3/3), dann alle Ergebnisse, bei denen 2 Bedingungen übereinstimmen (2/3), und schließlich die Ergebnisse, bei denen 1 Bedingung übereinstimmt (1/3).

Jede dieser 3 Ergebnismengen muss nach geordnet werden (col4, col5, col6).

Kann ich das in einer einzigen Abfrage tun?

Zum Beispiel:

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

Skript zum Erstellen von Testdaten:

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
quelle
wenn möglich ohne 3! Join the Sample haben 3 erste Spalte, aber in Wirklichkeit ist es mehr als das
forX
Sie möchten also alle Zeilen finden, in denen alle drei Bedingungen übereinstimmen, in denen zwei Bedingungen übereinstimmen, in denen eine Bedingung übereinstimmt, und alle Ergebnisse zusammenfassen, sortiert nach Spalte 4, 5 und 6. Ist das richtig?
Nick Chammas
Ja, ich weiß, ich habe einen anderen Weg gesucht, weil es mehr als 3 col
forX
1
Nun, für den Moment ist sein Zugriff (ich warte darauf, meine SQL Server-Datenbank zu bekommen)
forX
3
Wenn Sie eventuell SQL Server verwenden, installieren Sie die Express Edition . Bereinigen Sie den Upgrade-Pfad zu einer kostenpflichtigen Version und behandeln Sie keine Syntax-Besonderheiten in Access.
Mark Storey-Smith

Antworten:

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 

oder für MS-Access:

ORDER BY IIF(col1 = 1,1,0) +
         IIF(col2 = 2,1,0) +
         IIF(col3 = 3,1,0) DESC,
         col4, col5, col6 
ypercubeᵀᴹ
quelle
@ Mark: Welche Kombinationen meinst du? Kannst du ein Beispiel geben?
Ypercubeᵀᴹ
@ypercube Ich gebe zu, +1 :)
Mark Storey-Smith
@ Mark: Danke, ich begann mir Sorgen zu machen, dass ich die Frage nicht verstanden hatte.
Ypercubeᵀᴹ
scheint gut zu sein, aber ich bin jetzt mit Zugriffsdatenbank auf Lager, und ich versuche dies, und ich erhalte kein gutes Ergebnis (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
Kleine Änderung:IIF(col1 = 1,1,0) +IIF(col2 = 2,1,0) +IIF(col3 = 3,1,0) desc
ypercubeᵀᴹ
1

Würde dies erreichen, was Sie wollen? Technisch gesehen ist die Inline-Ansicht nicht erforderlich, da Sie die case-Anweisung in der Reihenfolge von wiederholen können.

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 
Klumpig
quelle
1
Was ist, wenn col1 und col3 übereinstimmen? Oder nur col2? Das OP sucht nach allen drei Übereinstimmungen, zwei beliebigen Übereinstimmungen und beliebigen Übereinstimmungen.
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
quelle
Nein, diese Abfrage ordnet die Zeile mit (col1,col2,col3)= (1,0,0)(1 Übereinstimmung) vor der Zeile mit (0,2,3)(2 Übereinstimmungen).
Ypercubeᵀᴹ