用于选择具有编码的数据的SQL
需要一个快速的SQL来选择我的数据。 我有一个表用于选择具有编码的数据的SQL,sql,oracle,Sql,Oracle,需要一个快速的SQL来选择我的数据。 我有一个表a,如下所示: 另一个表b,如下所示: 在au中,可以指定我需要b中的哪些数据。它是一个标志(I=Inclusiv,E=Excluisiv) 两个表中的键都位于前四列 a中的第一行表示b中具有b.art\u be=a.kba\u be的所有Artikel a中的第二行表示没有b中的文章,其中b.art\u be=a.kba\u be和b.art\u wg=a.kba\u wg。等等 在a中:0表示全部(从1-99) 在b中不能出现a0 表a:
a
,如下所示:
另一个表b
,如下所示:
在a
u中,可以指定我需要b
中的哪些数据。它是一个标志(I
=Inclusiv,E
=Excluisiv)
两个表中的键都位于前四列
a
中的第一行表示b
中具有b.art\u be=a.kba\u be
的所有Artikel
a
中的第二行表示没有b
中的文章,其中b.art\u be=a.kba\u be和b.art\u wg=a.kba\u wg
。等等
在a
中:0
表示全部(从1-99
)
在b
中不能出现a
0
表a:
|------|------|------|-------|--------|
|kba_be|kba_wg|kba_ag|kba_anr|kba_inkl|
|------|------|------|-------|--------|
|10 |0 |0 |0 |I |
|------|------|------|-------|--------|
|10 |10 |0 |0 |E |
|------|------|------|-------|--------|
|10 |20 |30 |0 |E |
|------|------|------|-------|--------|
|20 |10 |0 |0 |I |
|------|------|------|-------|--------|
|20 |0 |0 |0 |E |
|------|------|------|-------|--------|
表b:
|------|------|------|-------|
|art_be|art_wg|art_ag|art_anr|
|------|------|------|-------|
|10 |20 |30 |40 |
|------|------|------|-------|
|10 |10 |1 |5 |
|------|------|------|-------|
|10 |5 |30 |20 |
|------|------|------|-------|
|10 |10 |80 |50 |
|------|------|------|-------|
|10 |60 |30 |60 |
|------|------|------|-------|
|20 |10 |50 |50 |
|------|------|------|-------|
|20 |60 |30 |60 |
|------|------|------|-------|
结果:
|------|------|------|-------|
|art_be|art_wg|art_ag|art_anr|
|------|------|------|-------|
|10 |5 |30 |20 |
|------|------|------|-------|
|10 |60 |30 |60 |
|------|------|------|-------|
|20 |10 |50 |50 |
|------|------|------|-------|
有人有主意吗
非常感谢
编辑:可能表a应按如下方式分组:
|------|------|------|-------|--------|
|kba_be|kba_wg|kba_ag|kba_anr|kba_inkl|
|------|------|------|-------|--------|
|10 |0 |0 |0 |I |
|------|------|------|-------|--------|
|20 |0 |0 |0 |E |
|------|------|------|-------|--------|
|10 |10 |0 |0 |E |
|------|------|------|-------|--------|
|20 |10 |0 |0 |I |
|------|------|------|-------|--------|
|10 |20 |30 |0 |E |
|------|------|------|-------|--------|
然后在行中循环。因此查询分为包含和排除两部分 可以使用
减号
运算符实现独占
with a as
(
select 10 kba_be,0 kba_wg,0 kba_ag,0 kba_anr,'I' kba_incl from dual union all
select 10 kba_be,10 kba_wg,0 kba_ag,0 kba_anr,'E' kba_incl from dual union all
select 10 kba_be,20 kba_wg,30 kba_ag,0 kba_anr,'E' kba_incl from dual
),
b as
(
select 10 art_be,20 art_wg,30 art_ag,0 art_anr from dual union all
select 10 art_be,10 art_wg,1 art_ag,5 art_anr from dual union all
select 10 art_be,5 art_wg,30 art_ag,20 art_anr from dual union all
select 10 art_be,10 art_wg,80 art_ag,50 art_anr from dual union all
select 10 art_be,60 art_wg,30 art_ag,60 art_anr from dual
)
select b.* from
a,b
where
a.kba_incl = 'I'
and b.art_be = a.kba_be
and (b.art_wg = a.kba_wg or a.kba_wg=0)
and (b.art_ag = a.kba_ag or a.kba_ag=0)
minus
select b.* from
a,b
where
a.kba_incl = 'E'
and b.art_be = a.kba_be
and (b.art_wg = a.kba_wg or a.kba_wg=0)
and (b.art_ag = a.kba_ag or a.kba_ag=0)
结果
10 5 30 20
10 60 30 60
这些神秘的列名使理解这个问题变得更加复杂。请提供两个表的列之间的精确映射。我对其进行了一些编辑。请以文本格式提供示例数据和预期输出。图像是受欢迎的,但它们对数据处理毫无用处。实际上,不清楚您的包含/排除逻辑和规则实施的优先级是什么。我建议澄清这些,然后提供涵盖所有可能情况的有效示例。我认为,当我们查看排序表a时,这一点是明确的。要处理的顺序。您的SQL很好,但是对于扩展的表,它不会正确工作。@AntonSchrage根据排除规则:应该排除
art\u be=20
的行-那么您的预期结果为什么会包含一个呢?因为我的规则说art\u be=20
和art\u wg=10
应该是included@AntonSchrage这不是您的表中的内容比如说,它说你是对的,但如果我在表a中说,我想看看那些记录。