Запросите наилучшие совпадения и закажите их


9

Я пытаюсь написать запрос по этим направлениям:

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

Сначала я хочу получить все результаты, в которых WHEREсовпадают все 3 условия (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 col
forX

1
хорошо, на данный момент его доступ (я жду, чтобы получить мой sql server 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-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 :)
Марк Стори-Смит

@Mark: Thnx, я начинал беспокоиться, что я не понял вопрос.
ypercubeᵀᴹ

кажется хорошим, но у меня сейчас сток с доступом к БД, и я пробую это, и я не получаю хорошего результата (ВЫБЕРИТЕ col1, col2, col3, col4, col5, col6 ОТ mytable WHERE col1 = 1 ИЛИ col2 = 2 ИЛИ 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? ОП ищет все 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.