SQL select 返回定义的行数
SQL select returning a defined number of rows
我想获得 14 行的查询结果,即使 table 只有 6 条记录可用。
例如 table 只有 6 条记录,所以我想创建一个 SELECT,输出结果是 6 条记录和 8 个空白行。
像这样:
|trackings |
---------------
|track1 |
|track2 |
|track3 |
|track4 |
|track5 |
|track6 |
| *blank* |
| *blank* |
| *blank* |
| *blank* |
| *blank* |
| *blank* |
| *blank* |
| *blank* |
我在 google 上搜索如何实现此目的,但我找不到最好的标签来找到它,我阅读了一些使用 UNION 的示例,但在这种情况下超过 1 个空白或自定义行。
请注意,table 中的记录可能会更改,但我只需要 14 行。这些可以是包含数据的 14 行,也可以是其中一些空白,具体视情况而定。
谢谢,对不起我的英语!
如果您不关心行是否为空,您可以生成行。这是使用 outer apply
:
的方法
with t as (
select t.*, row_number() over (select null) as seqnum
from t
)
select t.*
from (values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (13), (14)
) n(n) left join
t
on t.n = n.n;
您也可以使用数字 table 或子查询来生成数字。
我添加了 otherField1、otherField2 只是为了做一个通用的回答
这个结果集,总是有 14 条记录,如果 table
中的记录少于该数字,则最新的记录为空
select top 14 tracking, otherField1, otherField2
from (
select tracking, otherField1, otherField2, 1 as orderBy from yourTable
union all select null, null, null, 2
union all select null, null, null, 2
union all select null, null, null, 2
union all select null, null, null, 2
union all select null, null, null, 2
union all select null, null, null, 2
union all select null, null, null, 2
union all select null, null, null, 2
union all select null, null, null, 2
union all select null, null, null, 2 -- this is 14 times here
) as subQuery
order by orderBy, tracking
您最好在您的应用程序层中实现它,但是,如果您想在 SQL 中实现它,您可以使用 CTE 来实现它。第一个 CTE 创建 14 个空记录,在第二个 CTE 中,这些空记录与您的查询结果合并,在最终查询中,选择前 14 个结果,对顶部的非空记录进行排序:
WITH cte
AS ( SELECT 0 AS Id ,
' ' AS EmptyData
UNION ALL
SELECT Id + 1 AS Id ,
EmptyData
FROM cte
WHERE Id < 14
),
cte2
AS ( SELECT 1 AS SortOrder ,
trackings
FROM dbo.data
UNION ALL
SELECT 2 AS SortOrder ,
EmptyData
FROM cte
)
SELECT TOP 14
trackings
FROM cte2
ORDER BY SortOrder
这种方法的优点是您可以轻松更改记录总数,只需将两次出现的 14 替换为不同的数字即可。
我想获得 14 行的查询结果,即使 table 只有 6 条记录可用。
例如 table 只有 6 条记录,所以我想创建一个 SELECT,输出结果是 6 条记录和 8 个空白行。
像这样:
|trackings |
---------------
|track1 |
|track2 |
|track3 |
|track4 |
|track5 |
|track6 |
| *blank* |
| *blank* |
| *blank* |
| *blank* |
| *blank* |
| *blank* |
| *blank* |
| *blank* |
我在 google 上搜索如何实现此目的,但我找不到最好的标签来找到它,我阅读了一些使用 UNION 的示例,但在这种情况下超过 1 个空白或自定义行。
请注意,table 中的记录可能会更改,但我只需要 14 行。这些可以是包含数据的 14 行,也可以是其中一些空白,具体视情况而定。
谢谢,对不起我的英语!
如果您不关心行是否为空,您可以生成行。这是使用 outer apply
:
with t as (
select t.*, row_number() over (select null) as seqnum
from t
)
select t.*
from (values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (13), (14)
) n(n) left join
t
on t.n = n.n;
您也可以使用数字 table 或子查询来生成数字。
我添加了 otherField1、otherField2 只是为了做一个通用的回答
这个结果集,总是有 14 条记录,如果 table
select top 14 tracking, otherField1, otherField2
from (
select tracking, otherField1, otherField2, 1 as orderBy from yourTable
union all select null, null, null, 2
union all select null, null, null, 2
union all select null, null, null, 2
union all select null, null, null, 2
union all select null, null, null, 2
union all select null, null, null, 2
union all select null, null, null, 2
union all select null, null, null, 2
union all select null, null, null, 2
union all select null, null, null, 2 -- this is 14 times here
) as subQuery
order by orderBy, tracking
您最好在您的应用程序层中实现它,但是,如果您想在 SQL 中实现它,您可以使用 CTE 来实现它。第一个 CTE 创建 14 个空记录,在第二个 CTE 中,这些空记录与您的查询结果合并,在最终查询中,选择前 14 个结果,对顶部的非空记录进行排序:
WITH cte
AS ( SELECT 0 AS Id ,
' ' AS EmptyData
UNION ALL
SELECT Id + 1 AS Id ,
EmptyData
FROM cte
WHERE Id < 14
),
cte2
AS ( SELECT 1 AS SortOrder ,
trackings
FROM dbo.data
UNION ALL
SELECT 2 AS SortOrder ,
EmptyData
FROM cte
)
SELECT TOP 14
trackings
FROM cte2
ORDER BY SortOrder
这种方法的优点是您可以轻松更改记录总数,只需将两次出现的 14 替换为不同的数字即可。