Как создать запрос к MSSQL, возвращающий фиксированное число строк, даже если данных нет?

Рейтинг: 3Ответов: 1Опубликовано: 03.09.2014

Имеется таблица. Необходимо сделать к ней запрос и вернуть не менее 5 записей по определенным условиям. Если в таблице нет 5 записей, удовлетворяющих заданным условиям, необходимо, чтобы вернулись те записи, которые удовлетворяют условию (например, 3 записи), и еще 2 записи с какими-то фиксированными данными (числовые поля 0, строковые - пустые строки).

Пример. Таблица table

| INT id | INT data | VARCHAR str_data | INT status |
-----------------------------------------------------
| 1      | 123      | "qwert"          | 1          |
-----------------------------------------------------
| 2      | 343      | "zzzzz"          | 1          |
-----------------------------------------------------
| 3      | 923      | "qweq"           | 2          |
-----------------------------------------------------
| 4      | 843      | "qdfgrt"         | 2          |
-----------------------------------------------------
| 5      | 763      | "qddftp"         | 1          |
-----------------------------------------------------

Необходим запрос (SELECT data, str_data, status FROM table WHERE status = 1), который вернет следующее:

| INT data | VARCHAR str_data | INT status |
--------------------------------------------
| 123      | "qwert"          | 1          |
--------------------------------------------
| 343      | "zzzzz"          | 1          |
--------------------------------------------
| 763      | "qddftp"         | 1          |
--------------------------------------------
| 0        | ""               | 0          |
--------------------------------------------
| 0        | ""               | 0          |
--------------------------------------------

Единственное, что приходит в голову, это держать в таблице 5 "нулевых" записей (последние 2 строки), но этот вариант не нравится.

Ответы

▲ 2Принят

Например, так:

select top 5 * from (
SELECT data, str_data, status FROM table WHERE status = 1
union all
select 0, '', 0
union all
select 0, '', 0
union all
select 0, '', 0
union all
select 0, '', 0
union all
select 0, '', 0
) X
 order by status desc