Mümkün olan en iyi eşleşmeleri sorgulayın ve sipariş edin


9

Bu satır boyunca bir sorgu yazmaya çalışıyorum:

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

Önce tüm 3 WHEREkoşulun (3/3) eşleştiği tüm sonuçları, daha sonra 2 koşulun eşleştiği tüm sonuçları (2/3) ve son olarak 1 koşulun eşleştiği sonuçları (1/3) istiyorum.

Bu 3 sonuç kümesinin her biri tarafından sipariş edilmelidir (col4, col5, col6).

Bunu tek bir sorguda yapabilir miyim?

Örneğin:

örnek http://img708.imageshack.us/img708/1646/sampletableresult1.jpg

Test verileri oluşturmak için komut dosyası:

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

mümkünse 3 olmadan! örnek katılmak 3 ilk col var, ama gerçekte, bundan daha fazla
forX

Bu nedenle, 3 koşulun da eşleştiği, ardından herhangi bir 2 koşulun eşleştiği, ardından herhangi bir 1 koşulun eşleştiği ve tüm sonuçları bir araya getirerek, col4, 5 ve 6'ya göre sıralanan tüm satırları bulmak istersiniz.
Nick Chammas

Evet, biliyorum, başka bir yol arıyordum, çünkü 3'ten fazla col
forX

1
iyi, şu an onun erişimi için (sql server db almak için bekliyorum)
forX

3
Sonunda SQL Server kullanacaksanız, hızlı sürümü yükleyin . Ücretli bir sürüm için yükseltme yolunu temizleyin ve Access'teki sözdizimi terimleriyle uğraşmayın.
Mark Storey-Smith

Yanıtlar:


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 

veya MS-Access için:

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

@Mark: Ne demek istediğin kombinasyonlar? Bir örnek verebilir misin?
ypercubeᵀᴹ

@ypercube Kabul ediyorum, +1 :)
Mark Storey-Smith

@ Mark: thnx, soruyu anlamadığım için endişelenmeye başlamıştım.
ypercubeᵀᴹ

iyi görünüyor, ama şimdi erişim db ile stok ve ben bunu denemek ve ben iyi sonuç alamadım (SELECT col1, col2, col3, col4, col5, col6 den denilebilir WOLE col1 = 1 VEYA col2 = 2 VEYA col3 = 3 SİPARİŞ TARAFINDAN IIF (sütun1 = 1,1,0) + IIF (sütun2 = 1,1,0) + IIF (sütun3 = 1,1,0) desc, col4, col5, col6)
forX

Küçük değişiklik:IIF(col1 = 1,1,0) +IIF(col2 = 2,1,0) +IIF(col3 = 3,1,0) desc
ypercubeᵀᴹ

1

Bu istediğinizi başarır mı? Teknik olarak satır içi görünüm, vaka ifadesini sırayla tekrarlayabileceğiniz için gerekli değildir.

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
Ya col1 ve col3 eşleşirse? Yoksa sadece col2? OP 3 maçın, herhangi bir iki maçın, bir maçın tümünü arıyor .
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

Hayır, bu sorgu, (2 eşleşme) satırından önce (col1,col2,col3)= (1,0,0)(1 eşleşme) içeren satırı sıralar (0,2,3).
ypercubeᵀᴹ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.