Sql 使用多个键进行子选择

Sql SubSelect With Multiple Keys

我正在尝试将行从 1 table 复制到其自身的副本,但只包括存在于第二个 table 中的帐户的行。

这只适用于一个关键字段(帐户),如下所示:

insert into newlibr.acpmstpf
select * from oldlibr.acpmstpf as source
where not exists
(select *
 from newlibr.acpmstpf as target
 where target.acpno    = source.acpno
   and target.acpbrn   = source.acpbrn
   and target.acpitm   = source.acpitm)
 and source.acpno in (select account from accinfo)

在这种情况下,我试图将模式 oldlibr 中的原始 table acpmstpf 中的行插入到 newlibr 中自身的副本,匹配 2 个键 account/branch 上的行(acpno/acpbrn) 并且只插入帐户在第二个 table accinfo.

中的那些行

我真正想做的是只插入帐户和分支机构在 accinfo 中的那些行,因为如果 accinfo 中只有 2 个分支机构而 acpmstpf 上有 100 个分支机构,它会复制所有 100 行。

我知道我可以通过连接来做到这一点,但是我必须指定所有的列(可能有很多列 - 我有几个 tables 这种情况)。

有没有办法做到这一点并且仍然使用子select?

使用exists:

insert into newlibr.acpmstpf
    select *
    from oldlibr.acpmstpf as source
    where not exists (select 1
                      from newlibr.acpmstpf as target
                      where target.acpno = source.acpno and
                            target.acpbrn = source.acpbrn
                            target.acpitm = source.acpitm
                     ) and
           exists (select 1
                   from accinfo a
                   where source.acpno = a.accinfo and
                         source.acpbrn = a.acpbrn
                  );

您想更换

and source.acpno in (select account from accinfo)

并改为查找元组 (account, branch)。许多 DBMS 支持这个:

and (source.acpno, source.acpbrn) in (select account, branch from accinfo)

对于那些没有的 DBMS,您必须求助于 EXISTS

and exists
(
  select * 
  from accinfo
  where accinfo.account = source.acpno
    and accinfo.branch = source.branch
)