Как убедиться, что запись всегда находится в возвращенном списке и правильно упорядочена - PullRequest
0 голосов
/ 08 января 2020

Я пытаюсь написать оператор выбора, который всегда будет включать указанную запись c (42 в приведенном ниже примере) независимо от того, как упорядочены данные. Использование ORDER BY IIF( ID = 42, 0, 1 ) позволит записи всегда показываться в возвращенном наборе данных, но она всегда находится вверху, а не правильно отсортирована.

ID  ID  vs  ID  ID
------      ------
42  42      0   40
0   40      1   41
1   41      2   42
2   43      3   43
3   44      4   44
4   45      5   45
5   46      6   46
6   47      7   47
7   48      8   48
8   49      42  49

Вот пример, который я создал, чтобы проиллюстрировать различные примеры использования в реальном мире. :

SET NOCOUNT ON;

DECLARE @Table TABLE ( ID int );
DECLARE @ID int = 0;

WHILE ( @ID < 100 )
BEGIN
    INSERT INTO @Table ( ID )
    VALUES ( @ID );

    SET @ID += 1;
END

SELECT TOP(10) ID 
FROM @Table
ORDER BY IIF( ID = 42, 0, 1 ), ID;

SELECT TOP(10) ID 
FROM @Table
WHERE ID > 30
ORDER BY IIF( ID = 42, 0, 1 ), ID;

SELECT TOP(10) ID 
FROM @Table
WHERE ID > 40
ORDER BY IIF( ID = 42, 0, 1 ), ID;

SELECT TOP(10) ID 
FROM @Table
WHERE ID > 50
OR ID = 42
ORDER BY IIF( ID = 42, 0, 1 ), ID;

Мне нужно определить оператор SELECT, чтобы удовлетворить как минимум 4 вышеуказанных варианта. Все, что я пробовал, стало довольно сложным, и я стараюсь сделать его как можно более простым.

1 Ответ

1 голос
/ 08 января 2020

Почему бы просто не использовать union?

SELECT *
FROM
(
    SELECT TOP(10) ID 
    FROM @Table
    ORDER BY ID

    UNION 

    SELECT ID
    FROM @Table
    WHERE ID = 42
) As x
ORDER BY ID
;
...