На первый взгляд, если объем передаваемых данных достаточно мал, вы можете использовать:
BEGIN WORK;
INSERT INTO D2:A
SELECT * FROM A WHERE a1 = 'something';
INSERT INTO D2:B
SELECT B.* FROM B JOIN A ON B.a1 = A.a1
WHERE A.a1 = 'something';
INSERT INTO D2:C
SELECT C.*
FROM C
JOIN B ON C.b1 = B.b1
JOIN A ON B.a1 = A.a1
WHERE A.a1 = 'something';
COMMIT WORK;
Можно упростить вещи, если условие на A
на самом деле так просто, как a1 = 'something'
, так что есть только одна запись из A
для передачи (поскольку a1
является первичным ключом A
).
BEGIN WORK;
INSERT INTO D2:A
SELECT * FROM A WHERE A.a1 = 'something';
INSERT INTO D2:B SELECT B.* FROM B
WHERE B.a1 = 'something';
INSERT INTO D2:C
SELECT C.*
FROM C
JOIN B ON C.b1 = B.b1
WHERE B.a1 = 'something';
COMMIT WORK;
Это позволяет избежать присоединений к таблице. A
.
Если объем данных делает это нелепым, вы, вероятно, застряли с чем-то вроде выгрузки и перезагрузки данных. Было бы разумно заблокировать таблицы в режиме общего доступа при их выгрузке.
Какой объем делает операцию тройной вставки нелепой? Сложно ответить, но если для передаваемых данных требуется больше места для логического журнала, чем у вас на сервере с D2
, у вас проблемы. Трудно решить, будет ли тогда лучше разделять транзакции или использовать go для выгрузки / перезагрузки. В целом, выгрузка / перезагрузка, вероятно, лучше, если требуемое пространство слишком велико.