oracle 如何从子查询插入字段

q3qa4bjr  于 2023-11-17  发布在  Oracle
关注(0)|答案(1)|浏览(159)

如何从子查询中插入字段。代码如下。我想在每个策略上添加最大孩子的出生日期。我得到一个错误,说我不能将空值插入目标表。我试图修改列以接受空值,但也不起作用。如果您有任何其他想法来将此插入目标表,我将非常感谢您的帮助!

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
;

字符串

uqdfh47h

uqdfh47h1#

您似乎想要一个相关的UPDATE,而不是INSERT,因为您试图修改(更新)现有行中的值,而不是创建(插入)新行。

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

字符串

  • 注:未经测试,因为我们没有你的表。*
  • 注意事项:M.ME_BIRTH_DATE IS NOT NULL过滤器是不必要的,因为你已经测试了M.ME_BIRTH_DATE是在过去的18年,不能是NULL,如果它匹配该过滤器。*
  • 注意事项:不要试图用每年365.25天来计算年龄,因为你会得到边缘情况,计算包括或排除不应该的18岁的人。使用ADD_MONTHS从今天减去18岁,并将其作为边界(或使用MONTHS_BETWEEN)。

您的代码不起作用,因为INSERT将尝试插入一个新行(它不会将新值插入到现有行中),并且因为您只指定了一个列,那么数据库将对该行的所有其他列使用默认值。如果您没有指定默认值,那么将使用NULL
这意味着:

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


是相同的:

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


这可能会被解决为:

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


NULL值问题是针对所有未指定的列,而不是针对指定的一列。
如果你确实想INSERT一个新行,那么你需要为表中的所有其他列指定值(除非你想让它们成为默认值,可能是NULL)。

相关问题