oracle 参数化联合

zzoitvuj  于 2023-11-17  发布在  Oracle
关注(0)|答案(1)|浏览(120)

我有以下表格

TabA

| 名称|数量|batchNo| tabType|
| --|--|--|--|
| X| 200 |null|一|
| X| 200 |null|一|
| X| 100 |null|一|

TabB

| 名称|数量|batchNo| tabType|
| --|--|--|--|
| X| 500 |null| B|
| Y| 50 |null| B|
我试图从表B中获取行,除非表A中已经有相同名称的行。问题似乎很容易,但我找不到优雅的解决方案。
我试图让
| 名称|数量|batchNo|
| --|--|--|
| X| 200 |null|
| X| 200 |null|
| X| 100 |null|
| Y| 50 |null|
当我联合所有两个表时,

塔贝拉联盟酒店

| 名称|数量|batchNo|
| --|--|--|
| X| 200 |null|
| X| 200 |null|
| X| 100 |null|
| X| 500 |null|
| Y| 50 |null|
我创建了(丑陋的)代码,看起来像这样

With UNI as
(Select * from TabA UNION ALL TabB)

Select * from UNI U
where
(EXISTS (Select 1 from UNI B where a.name=b.name and a.tabType<>b.tabType and NVL(a.batchNo)=NVL(b.batchNo)) and a.tabType ='A')
OR
NOT EXISTS (SELECT 1 from a.name=b.name and a.tabType<>b.tabType)

字符串
有没有一种方法可以参数化UNION,使它看起来更好?提前感谢任何帮助。

efzxgjgh

efzxgjgh1#

从表B中获取行,除非表A中已经有行同名
如果是这样的话,你为什么还要检查其他栏目?如果我们继续问问题,那么-
样本数据:

SQL> with
  2  taba (name, qty, batchno, tabtype) as
  3    (select 'x', 200, null, 'a' from dual union all
  4     select 'x', 200, null, 'a' from dual union all
  5     select 'x', 100, null, 'a' from dual
  6    ),
  7  tabb (name, qty, batchno, tabtype) as
  8    (select 'x', 500, null, 'b' from dual union all
  9     select 'y',  50, null, 'b' from dual
 10    )

字符串
Query看起来像这样:

11  select b.* from tabb b where not exists (select null from taba a where a.name = b.name)
 12  union all
 13  select a.* from taba a where     exists (select null from tabb b where b.name = a.name);

NAME              QTY BATCHNO    TABTYPE
---------- ---------- ---------- ----------
y                  50            b
x                 100            a
x                 200            a
x                 200            a

SQL>

相关问题