Как выбрать 7 строк или более из запроса выбора? даже если таблица возвращает менее 7 строк

#sql #sql-server #sql-server-2012

#sql #sql-сервер #sql-server-2012

Вопрос:

Мне нужен скрипт, который дает мне точные 7 строк. Например, если моя таблица возвращает только 2 строки, нам нужно добавить еще 5 строк, при этом все столбцы содержат нулевое значение. Но если таблица возвращает более 7 строк, тогда выберите все возвращенные строки. Пожалуйста, помогите!

Комментарии:

1. Одним из способов было бы sqlfiddle.com /#!18/132df/1

2. @Larnu: добавь еще 2 нулевых значения строк, мой друг.

3. @juergend спасибо за ответ. Я также пробовал это, но я хочу, чтобы, если таблица возвращает более 7 строк, мне нужны все возвращаемые строки. Я обновил свой вопрос, не могли бы вы проверить его еще раз?

4. Похоже, вы пытаетесь решить проблему отображения / представления на неправильном уровне.

5. @Damien_The_Unbeliever Да, потому что это целый динамический сайт, который создает слой отображения из базы данных.

Ответ №1:

Создайте фиктивную таблицу с 2 полями

 CREATE TABLE dummy (
  id INT NOT NULL,
  NullVals VARCHAR(5) DEFAULT NULL,
  PRIMARY KEY (id));
  

Теперь вставьте эти значения в эту таблицу:

 INSERT INTO dummy (id, NullVals) VALUES 
  (1, NULL),
  (2, NULL),
  (3, NULL),
  (4, NULL),
  (5, NULL),
  (6, NULL),
  (7, NULL);
  

выполните запрос следующим образом:

 Select acolumn from abc_table where acolumn like 'something'

union All

select NullVals from dummy
where id <= 7-(select count(*) from abc_table where acolumn like 'something');
  

Также вы можете заменить фиктивную таблицу на CTE

Ответ №2:

Попробуйте следующую логику-

Демонстрация здесь для менее чем 7 строк

Демонстрация здесь для более чем 7 строк

 WITH CTE(rn,id,name)
as
(
  select 1, null, null union all
  select 2, null, null union all
  select 3, null, null union all
  select 4, null, null union all
  select 5, null, null union all
  select 6, null, null union all
  select 7, null, null
)


SELECT a.id,a.name 
FROM
(
    select 
    ROW_NUMBER() OVER(order by id) rn,id,name
    from your_table
)A
full join CTE ON A.rn = cte.rn
  

Ответ №3:

Запрос приведен ниже:

 with cte1 as (
  select col1,col2,...,row_number() over(order by col1) as rn,count(*) over() as cnt from table1
  union all select null,null,...,rn,cnt 1 from cte1 where rn=1 and cnt<7
)
select col1,col2,... from cte1;
  

dbfiddle

Ответ №4:

Я бы сформулировал это как:

С FULL JOIN помощью метода вам нужно перечислить нужные столбцы или получить seqnum их в результирующем наборе:

 SELECT t.*  -- or list the columns to avoid seqnum
FROM (SELECT t.*, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) as seqnum
      FROM t
     ) t FULL JOIN
     (VALUES (1), (2), (3), (4), (5), (6), (7)) v(n)
     ON seqnum = v.n;
  

Альтернативой, которая не требует перечисления всех столбцов, является:

 select t.*
from t
union all
select t.*
from (values (1), (2), (3), (4), (5), (6), (7)) v(n) left join
     t
     on 1 = 0   -- never true
where v.n <= 7 - (select count(*) from t)