Permintaan kecocokan terbaik dan pesanlah


9

Saya mencoba menulis kueri di bawah ini:

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

Saya ingin semua hasil pertama di mana semua 3 WHEREkondisi cocok (3/3), lalu semua hasil di mana 2 kondisi cocok (2/3), dan akhirnya hasil di mana semua 1 kondisi cocok (1/3).

Masing-masing dari 3 set hasil ini harus dipesan oleh (col4, col5, col6).

Bisakah saya melakukannya dalam satu permintaan?

Sebagai contoh:

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

Script untuk membuat data uji:

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

jika memungkinkan tanpa 3! bergabung dengan sampel memiliki 3 col pertama, tetapi pada kenyataannya, lebih dari itu
forX

Jadi, Anda ingin menemukan semua baris di mana semua 3 kondisi cocok, lalu di mana 2 kondisi cocok, lalu di mana 1 kondisi apa pun cocok dan menyatukan semua hasil, diurutkan berdasarkan col4, 5, dan 6. Apakah itu benar?
Nick Chammas

ya, saya tahu, saya mencari cara lain, karena lebih dari 3 col
forX

1
baik, untuk saat ini yang akses (aku menunggu untuk mendapatkan server saya db sql)
forX

3
Jika pada akhirnya Anda akan menggunakan SQL Server, instal edisi ekspres . Bersihkan jalur peningkatan ke versi berbayar dan tidak ada berurusan dengan sintaks sintaksis di Access.
Mark Storey-Smith

Jawaban:


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 

atau, untuk MS-Access:

ORDER BY IIF(col1 = 1,1,0) +
         IIF(col2 = 2,1,0) +
         IIF(col3 = 3,1,0) DESC,
         col4, col5, col6 

@ Mark: Kombinasi apa yang Anda maksud? Bisakah Anda memberi contoh?
ypercubeᵀᴹ

@ypercube Saya mengakui, +1 :)
Mark Storey-Smith

@Mark: thnx, saya mulai khawatir bahwa saya tidak mengerti pertanyaannya.
ypercubeᵀᴹ

sepertinya bagus, tapi saya persediaan sekarang dengan akses db, dan saya coba ini, dan saya tidak mendapatkan hasil yang baik (PILIH col1, col2, col3, col4, col5, col6 DARI mytable WHERE col1 = 1 ATAU col2 = 2 ATAU col3 = 3 ORDER DENGAN IIF (col1 = 1,1,0) + IIF (col2 = 1,1,0) + IIF (col3 = 1,1,0) desc, col4, col5, col6)
forX

Modifikasi kecil:IIF(col1 = 1,1,0) +IIF(col2 = 2,1,0) +IIF(col3 = 3,1,0) desc
ypercubeᵀᴹ

1

Apakah ini akan mencapai apa yang Anda inginkan? Secara teknis tampilan inline tidak diperlukan karena Anda dapat mengulangi pernyataan kasus dalam urutan oleh.

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
Bagaimana jika col1 dan col3 cocok? Atau hanya col2? OP sedang mencari semua 3 pertandingan, dua pertandingan, satu pertandingan.
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

Tidak, kueri ini akan memesan baris dengan (col1,col2,col3)= (1,0,0)(1 kecocokan) sebelum baris dengan (0,2,3)(2 kecocokan).
ypercubeᵀᴹ
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.