Запитайте найкращі сірники та замовляйте їх


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. Це правильно?
Нік Чаммас

так, я знаю, я шукав інший спосіб, тому що його більше, ніж 3 кола
ForX

1
ну, на даний момент його доступ (я чекаю отримати свій сервер sql db)
forX

3
Якщо ви згодом будете використовувати SQL Server, встановіть експрес-версію . Чистий шлях оновлення до платної версії та не має стосунків із синтаксичними ідіосинкразіями в Access.
Марк Сторі-Сміт

Відповіді:


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-доступу:

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 :)
Марк Сторі-Сміт

@Mark: thnx, я починав хвилюватися, що не зрозумів питання.
ypercubeᵀᴹ

здається гарним, але я зараз на складі з доступом db, і я намагаюся це зробити, і я не отримую хорошого результату (ВИБІРТИ col1, col2, col3, col4, col5, col6 ІЗ mytable WHERE col1 = 1 АБО col2 = 2 АБО col3 = 3 ORDER BY ІМФ (col1 = 1,1,0) + ІМФ (col2 = 1,1,0) + ІМФ (col3 = 1,1,0) спадання, COL4, col5, col6)
при х

Невелика модифікація: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? ОП шукає всі 3 матчі, будь-які два матчі, будь-які .
Нік Чаммас

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ᵀᴹ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.