-2

我追求的场景是:

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)
  }
}

假设我有以下三个表。
IdName表 1,优先级 1
1  John
2  Mary
3  Elsa

IdName表 2,优先级 2
2  Steve
3  Max
4  Peter

IdName表 3,优先级 3
4  Frank
5  Harry
6  Mona

这是我需要的最终结果。

IdName结果
1  John
2  Mary
3  Elsa
4  Peter
5  Harry
6  Mona

一些提示要记住。
实际表数为 10。
每个表的行数超过 100 万。
没有必要在查询中使用连接,但由于我正在处理查询的数据量必须优化并在 SQL 中使用集合操作而不是游标脚本。

4

1 回答 1

4

这是一种使用UNIONand的方法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;
于 2017-02-20T16:41:17.300 回答