可能な限り一致するものをクエリして順序付け


9

私はこれらの行に沿ってクエリを書こうとしています:

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

最初に3つのWHERE条件すべてが一致するすべての結果(3/3)、次に任意の2つの条件が一致するすべての結果(2/3)、最後に任意の1つの条件が一致する結果(1/3)が必要です。

これら3つの結果セットのそれぞれは、によって順序付けされる必要があります(col4, col5, col6)

単一のクエリでそれを実行できますか?

例えば:

サンプルhttp://img708.imageshack.us/img708/1646/sampletableresult1.jpg

テストデータを作成するスクリプト:

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

できれば3なし!サンプルに参加すると、最初の3つの列がありますが、実際にはそれ以上です
forX

したがって、3つの条件すべてが一致し、次に2つの条件が一致し、次に1つの条件が一致するすべての行を検索し、すべての結果をまとめて、col4、5、および6でソートしたいとします。
Nick Chammas

ええ、私は知っています。私は別の方法を探していました。なぜならそれは3列を超えるからです
forX

1
さて

3
最終的にSQL Serverを使用する場合は、Express Editionをインストールします。有料のバージョンへのクリーンなアップグレードパス。Accessでの構文の特異性は扱いません。
Mark Storey-Smith

回答:


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 

または、MS-Accessの場合:

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

@マーク:どういう組み合わせですか?例を挙げていただけますか?
ypercubeᵀᴹ

@ypercube認めます、+ 1 :)
Mark Storey-Smith

@Mark:thnx、質問が理解できなかったのではないかと心配になり始めていました。
ypercubeᵀᴹ

良さそうですが、私は今アクセスdbを備えています。これを試しても、良い結果が得られません(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

小さな修正:IIF(col1 = 1,1,0) +IIF(col2 = 2,1,0) +IIF(col3 = 3,1,0) desc
ypercubeᵀᴹ

1

これはあなたが望むものを達成しますか?厳密には、ケースビューを次の順序で繰り返すことができるため、インラインビューは必要ありません。

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
col1とcol3が一致する場合はどうなりますか?または単にcol2?OPは、すべての3試合、探している任意の2試合、いずれかの試合。
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

いいえ、このクエリは、(2一致)の行の前に(col1,col2,col3)= (1,0,0)(1一致)の行を並べ替えます(0,2,3)
ypercubeᵀᴹ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.