在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
...
在这种情况下,a
和x
的数据类型必须兼容,与b
和y
等数据类型相同。
第一个SELECT语句中的列名(本例中为a
、b
和c
(将用作结果集的列名。
如果你不在乎它们是同一个结果集,只在乎一个查询返回所有结果集,你只需要在一个查询中生成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