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
)
我正在尝试将行从 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
)