如何为 SQL 服务器中的多优先级条件连接编写优化查询?
How to write optimized query for multiple prioritize conditional joins in SQL server?
我追求的场景是:
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)
}
}
假设我有以下三个 tables.
Id名称表 1,优先级 1
1 约翰
2 玛丽
3 艾尔莎
Id名称Table2,优先级 2
2 史蒂夫
3 最大
4 彼得
Id名称Table3,优先级 3
4 弗兰克
5 哈利
6 莫娜
这是我需要的最终结果。
Id名称结果
1 约翰
2 玛丽
3 艾尔莎
4 彼得
5 哈利
6 莫娜
一些要记住的提示。
实际 table 的数量是 10.
每个 table 的行数超过 100 万。
没有必要在查询中使用连接,但由于我正在处理的数据量很大,必须优化查询并在 SQL 而不是 Cursor 脚本中使用集合操作。
这是一种使用 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;
我追求的场景是:
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)
}
}
假设我有以下三个 tables.
Id名称表 1,优先级 1
1 约翰
2 玛丽
3 艾尔莎
Id名称Table2,优先级 2
2 史蒂夫
3 最大
4 彼得
Id名称Table3,优先级 3
4 弗兰克
5 哈利
6 莫娜
这是我需要的最终结果。
Id名称结果
1 约翰
2 玛丽
3 艾尔莎
4 彼得
5 哈利
6 莫娜
一些要记住的提示。
实际 table 的数量是 10.
每个 table 的行数超过 100 万。
没有必要在查询中使用连接,但由于我正在处理的数据量很大,必须优化查询并在 SQL 而不是 Cursor 脚本中使用集合操作。
这是一种使用 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;