2015-02-18 5 views
0

Я работаю с Java и MSSQL, я запускаю запрос с инструкцией where и хочу получить всегда не менее 20 элементов, иногда запрос извлекает 20 записей с данными, но иногда без данных, я использую 20 лучших, но когда нет совпадений с прошедшими критериями, набор результатов приходит пустым.Обеспечьте минимальное количество строк в наборе результатов

Мне нужен способ гарантировать, что по крайней мере 20 элементов всегда в наборе результатов не имеют значения, если у меня есть 20 строк с нулевыми элементами. Если запрос возвращает 10 элементов, мне нужно добавить 10 строк в resulset.

Я ищу это, используя только инструкцию SQL. У меня есть это, но мне не подходит то, что мне нужно

SELECT top 20 null as PROFILETITLE, null as DOCID 
union all 
SELECT t.pag_id,t.contract_number 
from (select 1 as adummy) a 
left join (
    select pag_id, contract_number from pag_log where pag_id = 11 
) t on 1=1 

Не уверен, что это возможно или нет.

+1

Используйте таблицу таблиц в качестве основы для вашего запроса. Вам просто нужно добавить ROW_NUMBER в свой запрос, чтобы вы могли присоединиться к таблице таблиц. –

+1

Зачем вам это нужно? – RealSkeptic

+1

Мне нужно создать файл excel и использовать ссылку Мне нужно, чтобы первые 20 строк указывали на одну таблицу шаблонов и следующие 20 строк, указывающих на вторую таблицу шаблонов, поэтому мне нужно всегда 40 записей, чтобы сделать эту работу – Koitoer

ответ

1

Это должно работать:

SELECT TOP 20 * 
FROM (
    SELECT Col1, Col2 
    FROM YourDesiredData 
    UNION ALL 
    SELECT TOP 20 NULL, NULL 
    FROM sys.all_columns 
) TMP 
+0

Это прекрасно работает, что я сделал не был SELECT TOP 20 NULL, NULL FROM sys.all_columns =) – Koitoer

+0

Лично мне не нравится лишний хит sys.all_columns. Это своего рода хак. –

1

Вы можете создать шаблонную таблицу только с номерами от 1 до 20 в нем, а затем оставили присоединиться к этому.

В моем примере я буду использовать CTE для заполнения таблицы.

with justATable(rowNumber) 
as 
(
    select 1 
    union all 
    select rowNumber + 1 
    from justATable where rowNumber < 20 
) 

select realData.pag_id, realData.contract_number 
from justATable 
left outer join 
(select ROW_NUMBER() OVER (order by contract_number) as RowNumber, 
     pag_id, 
     contract_number 
from pag_log 
where pag_id = 11) realData 
on justATable.rowNumber = realData.RowNumber 
+0

Я считаю, что это стратегия таблицы таблиц, но это похоже на код хранимой процедуры, а не просто на sql или я ошибаюсь? – Koitoer

+0

Это просто простой SQL. Вы можете объявить CTE, а затем использовать его в следующем операторе SQL. –

Смежные вопросы