简单的问题。我有一张桌子" tablename"有3行。当计算行数时,我需要在我的选择中显示5行。 5.
select * from tablename
+------------------+
|colname1 |colname2|
+---------+--------+
|1 |AAA |
|2 |BBB |
|3 |CCC |
+---------+--------+
在此查询中,我显示表中的所有行。 但我需要显示5行。 2行是空的。 例如(我需要):
+------------------+
|colname1 |colname2|
+---------+--------+
|1 |AAA |
|2 |BBB |
|3 |CCC |
| | |
| | |
+---------+--------+
最后2行为空。 有可能吗?
答案 0 :(得分:2)
这样的事情:
with num_rows (rn) as (
select i
from generate_series(1,5) i -- adjust here the desired number of rows
), numbered_table as (
select colname1,
colname2,
row_number() over (order by colname1) as rn
from tablename
)
select t.colname1, t.colname2
from num_rows r
left outer join numbered_table t on r.rn = t.rn;
这为tablename
中的每一行分配一个数字,并将其连接到固定数量的行。如果您知道colname1
中的值始终是连续的且没有间隙(这种可能性极小),那么您可以使用row_number()
删除第二个CTE中行号的生成。
如果您不关心返回哪些行,您可以省略order by
部分 - 但匹配的行将随机 。离开order by
会更有效率。
无论行tablename
包含多少行,上述内容总是会返回5行。如果您希望至少 5行,则需要翻转外部联接:
....
select t.colname1, t.colname2
from numbered_table t
left outer join num_rows r on r.rn = t.rn;
SQLFiddle示例:http://sqlfiddle.com/#!15/e5770/3