SQL Выбор последовательных строк с rownum

Попытка создать некоторые тестовые данные с помощью скрипта, заполнив TableA.colVal идентификаторами, которых еще нет в TableB.

Конечным результатом является то, что все TableA.colVal в конечном итоге заполняются TableB.ID_PK:

INSERT INTO tableA (colVal , aPK2, aPK3) VALUES
(
  (SELECT colVal , aPK2, aPK3
    FROM tableA
    WHERE colVal   NOT IN   
    (   
       SELECT bID_PK
        FROM (SELECT bID_PK, rownum r
           FROM (SELECT bID_PK
                  FROM TableB order by bID_PK DESC)
            )
         where r = 1  -- 
       )
     and rownum = 1)
  );

Таким образом, если у TableA есть colVals 1,2,5,6,7,8, а
у TableB есть bID_PKs 1,5,7

в частности, я хотел бы определить «отсутствующие» 3 значения TableB.bID_PK: 2, 6 и 8

Я попытался увеличить r = 1 в надежде получить следующее значение для заполнения, но я всегда получаю 1-й TableA.colVal, которого нет в TableB (поэтому все мои TableA.colVal получают одно и то же значение). Изменение rownum для внешнего выбора также не работает.

Помощь?

пояснение Мне нужно заполнить TableA.colVal значениями TableB.bID_PK, которые еще не существуют в TableA.colVal , где TableA имеет составной первичный ключ с 3 полями. Я могу вручную изменить значения оставшихся полей PK, но мне нужно заполнить оставшееся поле значением из TableB.bID_PK (который является первичным ключом TableB).


person frododot    schedule 20.10.2016    source источник
comment
Предложение values неверно, если вы хотите, чтобы источником insert был оператор select: INSERT INTO tableA (colVal , aPK2, aPK3) select ...   -  person a_horse_with_no_name    schedule 20.10.2016


Ответы (2)


select, который вы хотите, выглядит так:

select b.id
from b
where not exists (select 1 from a where a.aid = b.bid);

Вы можете вставить в существующую таблицу, используя insert, или создать новую таблицу, используя соответствующий синтаксис для вашей базы данных.

person Gordon Linoff    schedule 20.10.2016
comment
Поскольку TableA имеет составной первичный ключ, я не могу выполнить массовую вставку, как предписывает ваше решение. Мне нужно вставить 10-20 строк в TableA, где TableA.ID еще не имеет записи в TableB.ID. - person frododot; 20.10.2016
comment
@фродот . . . Можете ли вы задать еще один вопрос с примерными данными и желаемыми результатами? Я думаю, что этот вопрос не ясен, и проще просто начать сначала. - person Gordon Linoff; 20.10.2016

Может быть хорошим вариантом использования для КРОМЕ:

INSERT INTO TableA ({Primary Key Columns})
SELECT {Primary Key Columns} FROM TableB
EXCEPT
SELECT {Primary Key Columns} FROM TableA
person randcd    schedule 20.10.2016