在 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 行。
uj5u.com熱心網友回復:
使用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在這個例子中)將被用作結果集的列名。
uj5u.com熱心網友回復:
如果您不關心它們是相同的結果集,只需要一個回傳所有結果的查詢,您可以在 1 個查詢中創建 5 個單獨的選擇陳述句:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/402925.html
標籤:
