如何在没有表的SELECT语句中返回N条记录

时间:2014-06-24 14:34:08

标签: sql sql-server

我正在创建一个NACHA文件,如果文件中的记录数不是10的倍数,我们需要插入足够的“虚拟”记录,这些记录中填充了9个(replicate('9',94))以触及下一个数十个的地方。

我知道我可以写一个循环,或者填充一个包含10个9个记录的临时表并选择前N个。但这些选项感觉很笨。

我试图想出一个可以为我做的单一选择语句。有什么想法吗?

select nacha_rows
from NACHA_TABLE
union all
select replicate('9',94)  --do this 0 to 9 times

5 个答案:

答案 0 :(得分:1)

这应该有效。创建了一个包含9行虚拟数据的临时表。然后使用modulo确定应返回多少行。然后返回完整的数据集。如果你想要漂亮,你可以取出模数并在变量中计算一次。

;WITH dummydata (num, nines) 
 AS (SELECT 1 AS num, Replicate('9', 94) 
     UNION ALL 
     SELECT num + 1, Replicate('9', 94) 
     FROM   dummydata 
     WHERE  num < 9) 

SELECT * 
FROM   nacha_table 
UNION ALL 
SELECT nines 
FROM   dummydata 
WHERE  num >= CASE 
            WHEN (SELECT Count(1) % 10 FROM nacha_table) = 0 THEN 10 
            ELSE (SELECT Count(1) % 10 FROM nacha_table) 
          END 

答案 1 :(得分:1)

一个想法是准备9个填充行,而不仅仅添加到达下一个数十个相同的JChao想法所需的那些,具有不同的实现

With Filler AS (
  SELECT n.n, replicate('9',94) nacha_rows
  FROM (VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9)) n(n)
)
SELECT nacha_rows
FROM   NACHA_TABLE
UNION ALL
SELECT nacha_rows
FROM   Filler
       OUTER APPLY (SELECT count(1) % 10 last
                    FROM   NACHA_TABLE) l 
WHERE  filler.n + l.last <= 10
  AND  l.last > 0 -- to prevent filler line when NACHA_TABLE has exactly 10x rows

SQLFiddle demo

答案 2 :(得分:1)

公式(10-COUNT(*)%10)%10告诉您要添加多少行,因此您只需从现有虚拟表中选择许多虚拟行。

SELECT nacha_rows
FROM NACHA_TABLE
UNION ALL
SELECT TOP (SELECT (10-COUNT(*)%10)%10 FROM NACHA_TABLE) REPLICATE('9',94)
FROM master.dbo.spt_values

答案 3 :(得分:0)

看起来你需要一个虚拟选择语句:

select '1' as [col1], 'abcdef' as [col 2]
union all 
select '2' as [col1], 'abcdef' as [col 2]
union all 
select '3' as [col1], 'abcdef' as [col 2]
union all 
select '4' as [col1], 'abcdef' as [col 2]

答案 4 :(得分:0)

使用一组10行并加入的方式;

;with T(ord) as
(
    select 1 as ord union all select ord + 1 from T where ord < 10
)
select isnull(nacha_rows, replicate('9', 94)) from T left join (
    select  
        ROW_NUMBER() over (order by nacha_rows) row, nacha_rows
    from NACHA_TABLE
) T2 on row = ord

修改;刚才意识到桌子当然可以有&gt;首先是10行,在这种情况下这不会起作用。