가장 잘 일치하는 항목을 쿼리하여 주문


9

이 줄을 따라 쿼리를 작성하려고합니다.

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

먼저 3 가지 WHERE조건 이 모두 일치 하는 모든 결과 (3/3)를 찾은 다음 2 조건이 일치하는 모든 결과를 (2/3), 마지막으로 하나의 조건이 일치하는 결과 (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

따라서 세 조건이 모두 일치하고 두 조건이 일치하는 위치와 하나의 조건이 일치하는 모든 행을 찾고 모든 결과를 정리하여 col4, 5 및 6으로 정렬했습니다. 맞습니까?
Nick Chammas

그래, 나도 알아, 나는 다른 방법을 찾고 있었다. 왜냐하면 3 열 이상
forX

1
글쎄, 지금은 액세스 (내 SQL 서버 DB를 기다리고 있습니다)
forX

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

@ 마크 : thnx, 나는 그 질문을 이해하지 못했다고 걱정하기 시작했다.
ypercubeᵀᴹ

좋아 보이지만 액세스 db로 주식을 보유하고 있으며 시도해 보니 좋은 결과를 얻지 못합니다 (SELECT col1, col2, col3, col4, col5, col6 mytable WROME col1 = 1 OR col2 = 2 OR col3 = 3 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

이것이 당신이 원하는 것을 성취 할 것입니까? 기술적으로 인라인 뷰는 순서대로 case 문을 반복 할 수 있으므로 필요하지 않습니다.

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 개 일치, 1 일치 를 모두 찾고 있습니다.
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.