【发布时间】:2018-02-22 06:05:56
【问题描述】:
假设我有下表 tbl_Rules:
RuleID NameOperator NameValues TypeOperator TypeValue
1 NotIn John In 2
1 NotIn Alex In NULL
1 NotIn Mike In NULL
2 In Mike NotIn 2
我的源表看起来像这样 tbl_Source:
ID Name Type Cost
1 Mike 2 100
2 Cole 2 200
3 Ken 1 300
4 Tara 1 400
5 Mike 1 500
6 Sonya 1 600
7 Ann 2 700
8 Mike 1 800
我希望能够加入这两个表并得到以下结果 tbl_Result:
RuleID Name Type Cost
1 Cole 2 200
1 Ann 2 700
2 Mike 1 500
2 Mike 1 800
如果我手动编写此查询,我的查询将如下所示:
select 1, Name, Type, Cost
from tbl_Source
Where Name not in ('John', 'Alex', 'Mike') and Type in (2)
union all
select 2, Name, Type, Cost
from tbl_Source
where Name in ('Mike') and Type not in (2)
在我当前的设置中,tbl_Rule 有 500 条记录,tbl_Source 有 500k 条记录。
非常感谢您对此提出的任何建议。限制: 没有 CLR 函数,没有 2017 年的特性(例如 String_agg)
更新:可在此处找到上述示例的 DDL 语句:http://sqlfiddle.com/#!18/9a29f/2/0
【问题讨论】:
-
我很好奇,你为什么在 SQL 中这样做?
-
@MikeDinescu,好问题。这是我们当前的设置,没有办法在代码中做到这一点。但即使我们在代码中这样做,它看起来也会慢得多。 (正如我提到的,表有 500k 条记录和比这个例子中更多的列)
-
tbl_Rules中value列的NULL是什么意思?此外,值列是否可以保存类似 csv 的值1,2或只是一个值? -
@ZoharPeled,只是一个值。我们需要 NULL 的原因是因为 NameValues 有 3 条记录,TypeValue 有 1 条记录。可以忽略空值
标签: sql-server tsql sql-server-2016