2016-02-11 5 views
0

Я пытаюсь скопировать строки из 1 таблицы в собственную копию, но только включая строки для учетных записей, которые существуют во второй таблице.Sql SubSelect With Multiple Keys

Это хорошо работает только с одним ключевым полем (счета), как показано ниже:

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) 

В этом случае я пытаюсь вставить строки из исходной таблицы acpmstpf в схеме oldlibr на копию себя в newlibr, совпадающие строки на учетной записи/ветке 2 ключа (acpno/acpbrn) и ТОЛЬКО вставлять те строки, в которых учетная запись находится во второй таблице accinfo.

ЧТО Я ДЕЙСТВИТЕЛЬНО хочу сделать, это ТОЛЬКО вставить те строки, где ветка учетной записи & находится в accinfo, потому что, если только 2 ветки находятся в accinfo, а 100 на acpmstpf, она копирует все 100 строк.

Я знаю, что могу сделать это с помощью соединения, но тогда мне нужно будет указать все столбцы (которых может быть много - у меня этот сценарий для нескольких таблиц).

Есть ли способ, которым я мог бы это сделать и по-прежнему использовать подвыбор?

+3

С вопросами SQL * всегда * тег СУБД вы используете. –

+0

Спасибо Thorsten, не думал об этом, но на самом деле это DB2. –

+1

Хорошо, я добавил тэг для вас. –

ответ

2

Вы хотите заменить

and source.acpno in (select account from accinfo) 

и искать кортежей (счета, ветви) вместо этого. Многие СУБД поддерживают это:

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

Для тех СУБД, которые не, вам придется прибегнуть к EXISTS:

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

Я не знал о кортежах, отлично подходит для DB2 (IBM iSeries), очень спасибо. 1 имеет более 100 филиалов и может быть только 20 на нашей второй таблице, но основная таблица, которую мы вытягиваем, может иметь тысячи строк для каждой ветки. –

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 
       );