我追求的场景是:
Result = Nothing
CollectionOfTables = Tbl1, Tbl2, Tbl3
While(True){
CurrentTable = GetHighestPriorityTable(CollectionOfTables)
If(CurrentTable) = Nothing Then Break Loop;
RemoveCurrentTableFrom(CollectionOfTables)
ForEach ID in CurrentTable as TempRow {
If(Result.DoesntContainsId(ID)) Then Result.AddRow(TempRow)
}
}
假设我有以下三个表格
Id 名称表1,优先级1
1 约翰
2 玛丽
3 埃尔莎
Id 名称表2,优先级2
2 史蒂夫
3 最高
4 彼得
Id 名称表3,优先级3
4 谢
5 哈利
6 莫纳
这是我需要的最终结果。
编号 名称结果
1 约翰
2 玛丽
3 埃尔莎
4 彼得
5 哈利
6 莫纳
要记住一些提示。
实际表的数量是10.
每个表的行数超过1百万
没有必要在查询中使用join,但由于我使用查询的数据量必须优化并在SQL中使用set-operations而不是Cursor脚本。
答案 0 :(得分:3)
以下是使用UNION
和ROW_NUMBER()
;With Cte As
(
Select Id, Name, 1 As Prio
From Table1
Union All
Select Id, Name, 2 As Prio
From Table2
Union All
Select Id, Name, 3 As Prio
From Table3
), Ranked As
(
Select Id, Name, Row_Number() Over (Partition By Id Order By Prio) As RN
From Cte
)
Select Id, Name
From Ranked
Where RN = 1
Order By Id Asc;