Although, this example might not satisfy the OP's requirements,
here is an example inserting child and inserting parent(if it was necessary) in a statement.
(Insert into parent table was specified explicitly.)
CREATE tables for test:
Code:
------------------------------ Commands Entered ------------------------------
CREATE TABLE test_fk_parent
( pk INTEGER NOT NULL PRIMARY KEY
, desc VARCHAR(20)
);
------------------------------------------------------------------------------
DB20000I The SQL command completed successfully.
------------------------------ Commands Entered ------------------------------
CREATE TABLE test_fk_child
( pk1 INTEGER NOT NULL
, pk2 INTEGER NOT NULL
, desc VARCHAR(30)
, PRIMARY KEY(pk1 , pk2)
, FOREIGN KEY(pk1)
REFERENCES test_fk_parent(pk)
);
------------------------------------------------------------------------------
DB20000I The SQL command completed successfully.
INSERT first child row:
Code:
------------------------------ Commands Entered ------------------------------
WITH
insert_data(pk1 , pk2 , desc) AS (
VALUES (100 , 1 , 'First child of a parent.')
)
, inter_result1 AS (
SELECT *
FROM FINAL TABLE
(INSERT INTO test_fk_parent
( pk )
SELECT DISTINCT
pk1
FROM insert_data n
WHERE NOT EXISTS
(SELECT 0
FROM test_fk_parent e
WHERE e.pk = n.pk1
)
) p
)
, inter_result2 AS (
SELECT *
FROM FINAL TABLE
(INSERT INTO test_fk_child
SELECT *
FROM insert_data
) c
)
SELECT *
FROM inter_result1 r1
RIGHT OUTER JOIN
inter_result2 r2
ON r2.pk1 = r1.pk
;
------------------------------------------------------------------------------
PK DESC PK1 PK2 DESC
----------- -------------------- ----------- ----------- ------------------------------
100 - 100 1 First child of a parent.
1 record(s) selected.
INSERT second child row:
Code:
------------------------------ Commands Entered ------------------------------
WITH
insert_data(pk1 , pk2 , desc) AS (
VALUES (100 , 2 , 'Second child of a parent')
)
, inter_result1 AS (
SELECT *
FROM FINAL TABLE
(INSERT INTO test_fk_parent
( pk )
SELECT DISTINCT
pk1
FROM insert_data n
WHERE NOT EXISTS
(SELECT 0
FROM test_fk_parent e
WHERE e.pk = n.pk1
)
) p
)
, inter_result2 AS (
SELECT *
FROM FINAL TABLE
(INSERT INTO test_fk_child
SELECT *
FROM insert_data
) c
)
SELECT *
FROM inter_result1 r1
RIGHT OUTER JOIN
inter_result2 r2
ON r2.pk1 = r1.pk
;
------------------------------------------------------------------------------
PK DESC PK1 PK2 DESC
----------- -------------------- ----------- ----------- ------------------------------
- - 100 2 Second child of a parent
1 record(s) selected.
Result(rows in tables):
Code:
------------------------------ Commands Entered ------------------------------
SELECT * FROM test_fk_parent;
------------------------------------------------------------------------------
PK DESC
----------- --------------------
100 -
1 record(s) selected.
------------------------------ Commands Entered ------------------------------
SELECT * FROM test_fk_child;
------------------------------------------------------------------------------
PK1 PK2 DESC
----------- ----------- ------------------------------
100 1 First child of a parent.
100 2 Second child of a parent
2 record(s) selected.