【发布时间】:2017-08-22 17:49:10
【问题描述】:
我有一个复杂的 sql 需求,我需要根据控制表中的值将数据插入目标表(源表中的一组选择语句)。
控制表有attribute1、attribute2和action列的产品列表(INCLUDE/EXCLUDE)
此插入基于在产品级别(针对每个产品)完成的操作列的值。
对于动作 INCLUDE,我们有两种情况:
1.当attribute2不为null时,对于每个产品单独插入attribute1/attribute2组合并排除所有其他attribute1组合(对于该产品)
- 当属性 2 为空时,该产品包括所有属性 1 组合
对于控制表中的动作 EXCLUDE 我们有两种情况:
1.对于每个产品,排除提及的属性 1/属性 2 组合并包括所有其他属性 1 组合(针对该产品)
- 当属性 2 为空时,对于该产品,排除提及的属性 1 组合并包括所有其他属性 1 组合
下面是源表/控制表和里面的值。
create table #source(
Product varchar(100),
attribute12Value varchar(100),--(its a combination of attribute1,attribute2, some value)
colx varchar(100),
coly varchar(100),
)
create table #control(
attribute1 varchar(100),
attribute2 varchar(100),
value varchar(100),
Product varchar(100),
action varchar(100)
)
insert #source(Product ,attribute12Value ,colx,coly)
select 'HP', 'hw1-i3proc-ver1-sale','normal','Y'
insert #source(Product ,attribute12Value ,colx,coly)
select 'HP', 'hw2-i3proc-ver1-sale','normal','Y'
insert #source(Product ,attribute12Value ,colx,coly)
select 'HP', 'hw2-i5proc-ver1-sale','normal','Y'
insert #source(Product ,attribute12Value ,colx,coly)
select 'HP', 'hw2-i7proc-ver1-sale','normal','Y'
insert #source(Product ,attribute12Value ,colx,coly)
select 'HP', 'hw3-i3proc-ver1-sale','normal','Y'
insert #source(Product ,attribute12Value ,colx,coly)
select 'Dell', 'hw1-i3proc-ver1-sale','normal','Y'
insert #source(Product ,attribute12Value ,colx,coly)
select 'Dell', 'hw1-i5proc-ver1-sale','normal','Y'
insert #source(Product ,attribute12Value ,colx,coly)
select 'Dell', 'hw1-i7proc-ver1-sale','normal','Y'
根据控制表中的动作值,源表的输出应如下:
--case1 当属性 2 不为空时
--对于每个产品单独插入attribute1/attribute2组合并排除所有其他attribute1组合(对于该产品)
insert #control(attribute1 ,attribute2,value ,Product,action)
select 'hw2','i3proc','ver1','HP','INCLUDE'
--对于每个产品,排除提及的属性 1/属性 2 组合并包括所有其他属性 1 组合(针对该产品)
insert #control(attribute1 ,attribute2,value ,Product,action)
select 'hw2','i5proc','ver1','HP','EXCLUDE'
--case2 当属性 2 为空时 -- 对于该产品,包括所有属性 1 组合
insert #control(attribute1 ,attribute2,value ,Product,action)
select 'hw2',NULL,'ver1','HP','INCLUDE'
-- 对于该产品,排除提及的属性 1 组合并包括所有其他属性 1 组合
insert #control(attribute1 ,attribute2,value ,Product,action)
select 'hw3',NULL,'ver1','HP','EXCLUDE'
同样,此逻辑适用于所有其他产品,例如 DELL,然后将其插入目标表中。
我能够找到这样的 INCLUDE 逻辑:
select T1.Product,T1.attribute12Value,T1.colx,T1.coly from #control T
inner join #source T1 on T.action='INCLUDE'
and T.Product=T1.Product and PATINDEX(T.attribute1+'-'+isnull(T.attribute2,'')+'%',T1.attribute12Value)!=0
但我卡在 EXCLUDE 逻辑中,我需要排除提到的属性 1/2 组合并包括所有其他属性 1 组合。
通用 TSQL 逻辑是否可以应用于基于控制表的 EXCLUDE 记录的要求?
谢谢。
【问题讨论】:
-
请格式化...
-
提示:使用适当的软件(MySQL、Oracle、DB2 等)和版本标记数据库问题很有帮助,例如
sql-server-2014。语法和功能的差异通常会影响答案。请注意,tsql缩小了选择范围,但没有指定数据库。
标签: sql-server tsql