在多列上联接两个表,仅返回第一个表中不在第二个表中的记录

时间:2020-03-18 09:40:28

标签: sql oracle join

我有带数据的表1和有带元数据的查找表的表2。我需要一个查询,该查询返回表1中的任何列在表2中不存在的表1中的所有记录。 以下查询对于一列工作正常,但是如果我在联接中使用多个列,则不会。 工作查询:

select
T1.SCENARIO,
T1.year,
T1.period,
T1.ENTITY,
T1.account,
T1.ICP,
T1.MVMTS,
T1.C1,
T1.C2,
T1.C3,
T1.MULTI_GAAP,
T1.VLAUE

来自 “ fccs”。MV_FACT_FCCST1 左外部连接“ fccs”。V_META_NOT_FOUNDV2位于trim(T1.account)= trim(V2.account)

其中 V2.account为空

无法正常工作:

select
T1.SCENARIO,
T1.year,
T1.period,
T1.ENTITY,
T1.account,
T1.ICP,
T1.MVMTS,
T1.C1,
T1.C2,
T1.C3,
T1.MULTI_GAAP,
T1.VLAUE

来自 “ fccs”。MV_FACT_FCCST1 左外部联接“ fccs”。V_META_NOT_FOUNDV2在trim(T1.account)= trim(V2.account)上 和trim(T1.entity)= trim(v2.entity)

其中 V2.account为空或v2.entity为空

第二个查询继续从表1中带来表2中存在的记录。 任何帮助表示赞赏!

table1

table2

1 个答案:

答案 0 :(得分:0)

我需要一个查询,该查询返回表1中的任何记录,而表1中的任一列都不存在于表2中。

使用not exists

select ff.*
from "fccs".MV_FACT_FCCS ff
where not exists (select 1
                  from "fccs".V_META_NOT_FOUND mnf
                  where trim(ff.account) = trim(mnf.account)
                 ) or
      not exists (select 1
                  from "fccs".V_META_NOT_FOUND mnf
                  where trim(ff.entity) = mnf.trimc
                 ) ;

注意:这将回答书面问题。您可能表示两个条件都未满足。在这种情况下,请使用and而不是or