ค้นหาการจับคู่ที่ดีที่สุดและเรียงลำดับ


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
ดีสำหรับการเข้าถึงในขณะนี้ (ฉันกำลังรอรับ sql เซิร์ฟเวอร์ของฉัน db)
forX

3
ถ้าคุณจะได้รับการใช้ SQL Server ติดตั้งรุ่นด่วน ล้างเส้นทางการปรับรุ่นเป็นรุ่นที่ต้องชำระเงินและไม่มีการจัดการกับไวยากรณ์ที่เป็นเอกลักษณ์ใน 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 

@ Mark: ชุดค่าผสมที่คุณหมายถึงอะไร คุณยกตัวอย่างได้ไหม
ypercubeᵀᴹ

@ypercube ฉันยอมรับ +1 :)
ทำเครื่องหมาย Storey-Smith

@ Mark: ขอบคุณฉันเริ่มกังวลว่าฉันไม่เข้าใจคำถาม
ypercubeᵀᴹ

ดูเหมือนจะดี แต่ตอนนี้ฉันมีสต็อคเข้าถึงและฉันลองทำสิ่งนี้และฉันไม่ได้ผลลัพธ์ที่ดี (เลือก col1, col2, col3, col4, col5, col5, col6 จาก mytable WHERE col1 = 1 หรือ col2 = 2 หรือ col3 = 3 ORIF 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
เล็กน้อย

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 รายการการแข่งขันสองครั้งการแข่งขันนัดใดนัดหนึ่ง
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

ไม่แบบสอบถามนี้จะสั่งแถวที่มี(col1,col2,col3)= (1,0,0)(1 การแข่งขัน) ก่อนแถวที่มี(0,2,3)(2 การแข่งขัน)
ypercubeᵀᴹ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.