如何为SQL服务器中的多个优先级条件连接编写优化查询?

时间:2017-02-20 16:34:07

标签: sql sql-server join optimization set-operations

我追求的场景是:

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脚本。

1 个答案:

答案 0 :(得分:3)

以下是使用UNIONROW_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;