【问题标题】:Adhoc SQL Server Insert即席 SQL Server 插入
【发布时间】:2017-08-22 17:49:10
【问题描述】:

我有一个复杂的 sql 需求,我需要根据控制表中的值将数据插入目标表(源表中的一组选择语句)。

控制表有attribute1、attribute2和action列的产品列表(INCLUDE/EXCLUDE)

此插入基于在产品级别(针对每个产品)完成的操作列的值。

对于动作 INCLUDE,我们有两种情况:

1.当attribute2不为null时,对于每个产品单独插入attribute1/attribute2组合并排除所有其他attribute1组合(对于该产品)

  1. 当属性 2 为空时,该产品包括所有属性 1 组合

对于控制表中的动作 EXCLUDE 我们有两种情况:

1.对于每个产品,排除提及的属性 1/属性 2 组合并包括所有其他属性 1 组合(针对该产品)

  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 组合。

Sample Source Table

通用 TSQL 逻辑是否可以应用于基于控制表的 EXCLUDE 记录的要求?

谢谢。

【问题讨论】:

  • 请格式化...
  • 提示:使用适当的软件(MySQL、Oracle、DB2 等)和版本标记数据库问题很有帮助,例如sql-server-2014。语法和功能的差异通常会影响答案。请注意,tsql 缩小了选择范围,但没有指定数据库。

标签: sql-server tsql


【解决方案1】:

T-SQL(用于 SQL-Server 2008+ 版)有一个基于 EXCEPT 集合的运算符。

给定查询 A,从结果集中排除查询 B 定义的一组行:

-- result set
SELECT * FROM A

EXCEPT

-- rows to exclude/remove from result set
SELECT * FROM B

所以对于您的排除案例 1(对于每个产品,包括具有指定属性 1 的所有行,然后删除具有指定属性 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 null

【讨论】:

    猜你喜欢
    • 2012-08-22
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 2017-09-08
    相关资源
    最近更新 更多