我有一个复杂的sql要求,在其中,我需要根据控制表中的值将数据插入目标表(源表中的select语句集)。
控件表有带有attribute1、attribute2和action列(包括/排除)的产品列表。
此插入基于操作列的值,该列在产品级别(针对每个产品)进行。
至于行动,我们有两宗个案:
1.当attribute2不是null时,对每个产品单独插入该属性1/属性2组合,并排除所有其他atrribute1组合(对于该产品)
对于控制表中排除的行动,我们有两种情况:
1.对于每个产品,不包括上述属性1/属性2组合,并包括所有其他atrribute1组合(对于该产品)
下面是源表/control表及其中的值。
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'根据控制表中的操作值,源表的输出应如下所示:
--案例1当attribute2不为空时
-对每个产品单独插入该属性1/属性2组合,并排除所有其他atrribute1组合(对于该产品)
insert #control(attribute1 ,attribute2,value ,Product,action)
select 'hw2','i3proc','ver1','HP','INCLUDE'-对于每个产品,不包括上述属性1/属性2组合,并包括所有其他atrribute1组合(对于该产品)
insert #control(attribute1 ,attribute2,value ,Product,action)
select 'hw2','i5proc','ver1','HP','EXCLUDE'-当attribute2为null时为case2 2 --对于该产品,包括所有attribute1组合
insert #control(attribute1 ,attribute2,value ,Product,action)
select 'hw2',NULL,'ver1','HP','INCLUDE'-对于该产品,不包括上述attribute1组合,并包括所有其他属性1组合
insert #control(attribute1 ,attribute2,value ,Product,action)
select 'hw3',NULL,'ver1','HP','EXCLUDE'同样,这种逻辑也适用于所有其他产品,如戴尔,然后将其插入目标表。
我可以找到这样的包含逻辑:
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但是,我陷入了排除逻辑,需要排除上述属性1/2组合,并包含所有其他attribute1组合。
是否可以应用通用TSQL逻辑来满足基于控制表的排除记录的要求?
谢谢。
发布于 2017-08-22 06:09:46
based (用于Server版本2008+)有一个基于例外集的操作符.
给定查询A,从结果集中排除由查询B定义的一组行:
-- result set
SELECT * FROM A
EXCEPT
-- rows to exclude/remove from result set
SELECT * FROM B因此,对于排除用例1(对于每个产品包括所有具有指定attribute1的行,然后删除所有具有指定属性1/属性2组合的行):
select T1.Product,T1.attribute12Value,T1.colx,T1.coly from #control T
inner join #source T1 on T.action='EXCLUDE' and T.Product=T1.Product AND [... Your predicate for selecting all attribute1 combinations ... ] AND attribute2 is not null
EXCEPT
select T1.Product,T1.attribute12Value,T1.colx,T1.coly from #control T
inner join #source T1 on T.action='EXCLUDE' and T.Product=T1.Product AND [... Your predicate for selecting the combination attribute1/attribute2 ... ] AND attribute2 is not nullhttps://stackoverflow.com/questions/45807433
复制相似问题