0

1 つのテーブルからそれ自体のコピーに行をコピーしようとしていますが、2 番目のテーブルに存在するアカウントの行のみを含めます。

これは、以下のように 1 つのキー フィールド (アカウント) だけで問題なく機能します。

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 の元のテーブル acpmstpf から newlibr のそれ自体のコピーに行を挿入しようとしています。2 つのキー アカウント/ブランチ (acpno/acpbrn) の行を一致させ、アカウントが 2 番目にある行のみを挿入します。テーブルaccinfo。

私が本当にやりたいことは、アカウントとブランチが accinfo にある行のみを挿入することです。これは、accinfo にブランチが 2 つしかなく、acpmstpf に 100 ある場合、100 行すべてをコピーするためです。

結合を使用してこれを行うことができることはわかっていますが、すべての列を指定する必要があります (これは多数になる可能性があります。いくつかのテーブルに対してこのシナリオがあります)。

これを行い、サブセレクトを使用する方法はありますか?

4

2 に答える 2

2

交換したい

and source.acpno in (select account from accinfo)

代わりにタプル (アカウント、ブランチ) を探します。多くの 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
)
于 2016-02-11T12:51:22.793 に答える
1

使用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
                  );
于 2016-02-11T12:26:25.233 に答える