Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How to insert field from a subquery

How can I insert a field from a subquery. The code is below. I want to add in the date of birth for the oldest child on each policy. I am getting an error saying I can’t insert null values into the target table. I tried to alter the column to accept null values but that didn’t work either. If you have any other ideas to do this insert into the target table I would really appreciate the help!

Insert into JOURNEY_1A t (oldestchild_dob)
select A.oldestchild_dob
FROM
(
select DISTINCT T.POLICY_ID, max( M.ME_BIRTH_DATE) AS OLDESTCHILD_DOB
from JOURNEY_1A t, ALL_MTH S, member M
WHERE T.POLICY_ID = S.POLICY_ID
AND S.MONTH_ID = (SELECT MAX(MONTH_ID) FROM ALL_MTH )
AND S.MEMBER_ID = M.MEMBER_ID
AND trunc((to_date(sysdate)-m.me_birth_date)/365.25) BETWEEN 0 AND 17
AND M.ME_BIRTH_DATE IS NOT NULL 
group by t.policy_id
) A
JOIN JOURNEY_1A T
ON A.POLICY_ID = T.POLICY_ID
;

>Solution :

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

You appear to want a correlated UPDATE and not an INSERT as you are trying to modify (update) a value in an existing row and not create (insert) a new row.

UPDATE JOURNEY_1A t 
SET  oldestchild_dob = ( SELECT max( M.ME_BIRTH_DATE)
                         FROM   ALL_MTH S
                                INNER JOIN member M
                                ON S.MEMBER_ID = M.MEMBER_ID
                         WHERE  T.POLICY_ID = S.POLICY_ID
                         AND    S.MONTH_ID = (SELECT MAX(MONTH_ID) FROM ALL_MTH )
                         AND    m.me_date_of_birth > ADD_MONTHS(TRUNC(SYSDATE), -18*12)
                       );

Note: untested as we do not have your tables.

Note: the M.ME_BIRTH_DATE IS NOT NULL filter is not necessary as you already test that M.ME_BIRTH_DATE is in the last 18 years and cannot be NULL if it matches that filter.

Note: Do not try to calculate age using 365.25 days-per-year as you will get edge-cases where the calculation includes or excludes someone who is almost 18 when it should not. Use ADD_MONTHS to subtract 18 years from today and use that as the boundary (or use MONTHS_BETWEEN).


Your code does not work because INSERT will try to insert a new row (it does not insert a new value into an existing row) and because you are only specifying a single column then the database will use the default value for all the other columns of that row. If you have not specified a default value then NULL is used.

This means that:

Insert into JOURNEY_1A t (oldestchild_dob) VALUES (DATE '2023-01-01');

is the same as:

Insert into JOURNEY_1A t (policy_id, col1, col2, oldestchild_dob)
  VALUES (DEFAULT, DEFAULT, DEFAULT, DATE '2023-01-01');

which is probably going to be resolved as:

Insert into JOURNEY_1A t (policy_id, col1, col2, oldestchild_dob)
  VALUES (NULL, NULL, NULL, DATE '2023-01-01');

and the NULL value issue is for all the columns you do not specify, and not the one column that you do specify.

If you do want to INSERT a new row then you will need to specify values for all the other columns in the table (unless you intend them to be the default, probably NULL, value).

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading