Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于选择具有编码的数据的SQL_Sql_Oracle - Fatal编程技术网

用于选择具有编码的数据的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:

需要一个快速的SQL来选择我的数据。 我有一个表
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中说,我想看看那些记录。