【发布时间】:2020-02-18 17:21:32
【问题描述】:
我有两个表,我试图基于 SQL Server 2014 中的单个字段离开联接,但问题是这个单个字段包含一个与出现在不同列中的四个“级别”之一相关的值主表。 SalesOrg 字段也是键的一部分,因为在事务表和查找表中都可以有多个销售组织。
这是主要的事务表:
SalesOrg PHLevel1 PHLevel2 PHLevel3 PHLevel4 SalesQty
-----------------------------------------------------------------------
AB1 Z000 Y000 X000 V000 20
AB1 Z000 Y000 X000 V001 30
AB1 Z001 Y000 X001 V001 10
AB1 Z001 Y001 X000 V003 45
AB1 Z001 Y001 X000 V004 48
AB1 Z002 Y003 X002 V005 67
这是我尝试加入事务表的查找表:
SalesOrg PH PHLevel SalesRep
--------------------------------------------------
AB1 <null> 0 Mr. Pink
AB1 Z000 1 Mr. White
AB1 Z001 1 Mr. White
AB1 Z001Y000 2 Mr. Orange
AB1 Z001Y001 2 Mr. Orange
AB1 Z001Y001X000 3 Mr. Blonde
所以应该首先匹配“最低”(即最高PHLevel,3),即:
SalesOrg PHLevel1 PHLevel2 PHLevel3 PHLevel4 SalesQty SalesRep
---------------------------------------------------------------------------------
AB1 Z000 Y000 X000 V000 20
AB1 Z000 Y000 X000 V001 30
AB1 Z001 Y000 X001 V001 10
AB1 Z001 Y001 X000 V003 45 Mr. Blonde
AB1 Z001 Y001 X000 V004 48 Mr. Blonde
AB1 Z002 Y003 X002 V005 67
然后我们需要匹配尚未使用级别 3 匹配的级别 2:
SalesOrg PHLevel1 PHLevel2 PHLevel3 PHLevel4 SalesQty SalesRep
---------------------------------------------------------------------------------
AB1 Z000 Y000 X000 V000 20
AB1 Z000 Y000 X000 V001 30
AB1 Z001 Y000 X001 V001 10 Mr. Orange
AB1 Z001 Y001 X000 V003 45 Mr. Blonde
AB1 Z001 Y001 X000 V004 48 Mr. Blonde
AB1 Z002 Y003 X002 V005 67
然后我们需要匹配尚未使用级别 2 或 3 匹配的级别 1:
SalesOrg PHLevel1 PHLevel2 PHLevel3 PHLevel4 SalesQty SalesRep
---------------------------------------------------------------------------------
AB1 Z000 Y000 X000 V000 20 Mr. White
AB1 Z000 Y000 X000 V001 30 Mr. White
AB1 Z001 Y000 X001 V001 10 Mr. Orange
AB1 Z001 Y001 X000 V003 45 Mr. Blonde
AB1 Z001 Y001 X000 V004 48 Mr. Blonde
AB1 Z002 Y003 X002 V005 67
最后,对于任何剩余的项目,我们需要检查级别 0,这是“不匹配”条目的默认值:
SalesOrg PHLevel1 PHLevel2 PHLevel3 PHLevel4 SalesQty SalesRep
---------------------------------------------------------------------------------
AB1 Z000 Y000 X000 V000 20 Mr. White
AB1 Z000 Y000 X000 V001 30 Mr. White
AB1 Z001 Y000 X001 V001 10 Mr. Orange
AB1 Z001 Y001 X000 V003 45 Mr. Blonde
AB1 Z001 Y001 X000 V004 48 Mr. Blonde
AB1 Z002 Y003 X002 V005 67 Mr. Pink
如果在事务表中创建连接字段,以便更容易匹配查找表,则没有问题。
我不确定扩展查找表是否有利,以便 PH 字段包含“完全限定”值(即,PH 始终包含 PHLevel1/PHLevel2/@987654334 @/PHLevel4 值,例如 Z001Y000X001V001),但这可能会使查找表变大,然后可能会减慢连接速度(因为事务表可能包含一百万行)。
我不知道如何开始,因为我已经看到其他带有层次结构的示例,但是查找表并不完全是一个层次结构 - 请问在 SQL 中有什么优雅的解决方案吗?
【问题讨论】:
标签: sql sql-server join