Truy vấn phù hợp nhất có thể và đặt hàng chúng


9

Tôi đang cố gắng viết một truy vấn dọc theo những dòng này:

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

Tôi muốn đầu tiên tất cả các kết quả trong đó cả 3 WHEREđiều kiện khớp (3/3), sau đó tất cả các kết quả trong đó có 2 điều kiện khớp (2/3) và cuối cùng là kết quả trong đó bất kỳ 1 điều kiện nào khớp với (1/3).

Mỗi trong số 3 bộ kết quả này cần phải được sắp xếp theo (col4, col5, col6).

Tôi có thể làm điều đó trong một truy vấn không?

Ví dụ:

mẫu http://img708.imageshack.us/img708/1646/sampletableresult1.jpg

Script để tạo dữ liệu thử nghiệm:

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

nếu có thể mà không cần 3! tham gia mẫu có 3 col đầu tiên, nhưng trên thực tế, nó còn hơn thế
forX

Vì vậy, bạn muốn tìm tất cả các hàng trong đó cả 3 điều kiện khớp nhau, trong đó 2 điều kiện bất kỳ khớp với nhau, sau đó bất kỳ 1 điều kiện nào khớp và đặt tất cả các kết quả lại với nhau, được sắp xếp theo col4, 5 và 6. Điều đó có đúng không?
Nick Chammas

vâng, tôi biết, tôi đã tìm kiếm một cách khác, bởi vì nó hơn 3 col
forX

1
tốt, hiện tại quyền truy cập của nó (Tôi đang chờ để nhận db máy chủ sql của tôi)
forX

3
Nếu cuối cùng bạn sẽ sử dụng SQL Server, hãy cài đặt phiên bản express . Làm sạch đường dẫn nâng cấp lên phiên bản trả phí và không xử lý các đặc điểm cú pháp trong Access.
Mark Storey-Smith

Câu trả lời:


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 

hoặc, đối với MS-Access:

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

@Mark: Ý bạn là gì? Bạn có thể đưa ra một ví dụ không?
ypercubeᵀᴹ

@ypercube Tôi thừa nhận, +1 :)
Mark Storey-Smith

@Mark: thnx, tôi đã bắt đầu lo lắng rằng tôi đã không hiểu câu hỏi.
ypercubeᵀᴹ

Có vẻ tốt, nhưng hiện tại tôi đang có chứng khoán truy cập db và tôi đã thử điều này và tôi không nhận được kết quả tốt (CHỌN col1, col2, col3, col4, col5, col6 TỪ mytable WHERE col1 = 1 OR col2 = 2 OR col3 = 3 ĐẶT HÀNG B IING IIF (col1 = 1,1,0) + IIF (col2 = 1,1,0) + IIF (col3 = 1,1,0) desc, col4, col5, col6)
forX

Sửa đổi nhỏ:IIF(col1 = 1,1,0) +IIF(col2 = 2,1,0) +IIF(col3 = 3,1,0) desc
ypercubeᵀᴹ

1

Điều này sẽ đạt được những gì bạn muốn? Về mặt kỹ thuật, chế độ xem nội tuyến là không cần thiết vì bạn có thể lặp lại câu lệnh tình huống theo thứ tự.

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
Nếu col1 và col3 khớp nhau thì sao? Hay chỉ là col2? OP đang tìm kiếm tất cả 3 trận đấu, bất kỳ hai trận đấu, bất kỳ một trận đấu.
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

Không, truy vấn này sẽ sắp xếp hàng có (col1,col2,col3)= (1,0,0)(1 khớp) trước hàng có (0,2,3)(2 khớp).
ypercubeᵀᴹ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.