从5个表中的每一个表中获取前n条记录



在SQL Server 2016中,我有5个大表。在一个查询中从5个表中的每一个表中选择前1000条记录的最佳方法是什么?

例如,这会返回过多的数据。

Select * 
from table1 
cross apply table2
cross apply table3 
cross apply table4 
cross apply table5 with(nolock)

此外,我希望从5张表中的每一张表中获得每一列。。而只是每个表的前1000行。

使用UNION ALL而不是CROSS APPLY

注意:如果您只有一个查询,那么您就只有一个结果集。结果集必须具有定义良好的列列表。因此,您必须告诉SQL Server您在这些不同表中的哪些列是"列";等于";,通过将它们放在相同的位置。

示例:

SELECT TOP 1000 a, b, c FROM table1 ORDER BY d
UNION ALL
SELECT TOP 1000 x, y, z FROM table2 ORDER BY w
UNION ALL
...

在这种情况下,ax的数据类型必须兼容,与by等数据类型相同。

第一个SELECT语句中的列名(本例中为abc(将用作结果集的列名。

如果你不在乎它们是同一个结果集,只在乎一个查询返回所有结果集,你只需要在一个查询中生成5个单独的select语句:

SELECT TOP 1000 * FROM table1
SELECT TOP 1000 * FROM table2
SELECT TOP 1000 * FROM table3
SELECT TOP 1000 * FROM table4
SELECT TOP 1000 * FROM table5

如果出于某种原因,您需要将它们放在一个结果集中,包括一个行号列,那么将它们连接到行号上可能会起作用:

SELECT *
FROM (SELECT TOP 1000 ROW_NUMBER() OVER (ORDER BY [orderCol]) AS RN, * FROM table1) AS T1
JOIN (SELECT TOP 1000 ROW_NUMBER() OVER (ORDER BY [orderCol]) AS RN, * FROM table2) AS T2 ON T1.RN = T2.RN
JOIN (SELECT TOP 1000 ROW_NUMBER() OVER (ORDER BY [orderCol]) AS RN, * FROM table3) AS T3 ON T1.RN = T3.RN
JOIN (SELECT TOP 1000 ROW_NUMBER() OVER (ORDER BY [orderCol]) AS RN, * FROM table4) AS T4 ON T1.RN = T4.RN
JOIN (SELECT TOP 1000 ROW_NUMBER() OVER (ORDER BY [orderCol]) AS RN, * FROM table5) AS T5 ON T1.RN = T5.RN

最新更新