【问题标题】:How to write optimized query for multiple prioritize conditional joins in SQL server?如何为 SQL Server 中的多个优先级条件连接编写优化查询?
【发布时间】:2017-07-10 00:55:02
【问题描述】:

我追求的场景是:

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

假设我有以下三个表。
IdNameTable1,优先级 1
1  John kbd>
2  玛丽
3  艾尔莎

Id名称Table2,优先级2
2  Steve
3  最大
4  彼得

Id名称Table3,优先级3
4  Frank
5  哈利
6  莫娜

这是我需要的最终结果。

Id姓名结果
1  John
2   玛丽
3  艾尔莎
4  彼得
5  哈利
6  莫娜

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

【问题讨论】:

  • 到目前为止,您提出了什么(次优)解决方案?
  • @ChrisFlynn 其实我不懂 SQL 所以没什么!

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


【解决方案1】:

这是一种使用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;

【讨论】:

    猜你喜欢
    • 2018-12-27
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    相关资源
    最近更新 更多