Oracle SQL,正在尝试从select/join中获取一个值以用于更新一个表中的一列?

Oracle SQL,正在尝试从select/join中获取一个值以用于更新一个表中的一列?,sql,oracle,sql-update,dml,Sql,Oracle,Sql Update,Dml,我有一个包含以下列的表: T_RESOLVED_DATE I_HOUSEHOLD_NUMBER I_RESOLVED_SET_NUMBER I_STATION_CODE I_RESOLVED_START_MIN I_DURATION I_PERSON_NUMBER I_COVIEW_DEMO_ID T_RESOLVED_DATE I_HOUSEHOLD_NUMBER I_PERSON_NUMBER I_AGE T_GENDER I_COVIEW_DEMO_ID 最初,I_COVIEW_DEM

我有一个包含以下列的表:

T_RESOLVED_DATE
I_HOUSEHOLD_NUMBER
I_RESOLVED_SET_NUMBER
I_STATION_CODE
I_RESOLVED_START_MIN
I_DURATION
I_PERSON_NUMBER
I_COVIEW_DEMO_ID
T_RESOLVED_DATE
I_HOUSEHOLD_NUMBER
I_PERSON_NUMBER
I_AGE
T_GENDER
I_COVIEW_DEMO_ID
最初,I_COVIEW_DEMO_ID设置为null。 然后我有另一个具有以下列的表:

T_RESOLVED_DATE
I_HOUSEHOLD_NUMBER
I_RESOLVED_SET_NUMBER
I_STATION_CODE
I_RESOLVED_START_MIN
I_DURATION
I_PERSON_NUMBER
I_COVIEW_DEMO_ID
T_RESOLVED_DATE
I_HOUSEHOLD_NUMBER
I_PERSON_NUMBER
I_AGE
T_GENDER
I_COVIEW_DEMO_ID
我正在尝试使用第二个表中的I_COVIEW_DEMO_ID值更新第一个表中的I_COVIEW_DEMO_ID,其中T_解析日期、I_家庭号和I_个人号在两个表中相等。第一个表可能包含多个具有相同日期、家庭号码和个人号码的行,因为其他列的行可能不同

我曾经尝试过使用select和group,这似乎让我在某种程度上达到了目的,但是当我尝试更新第一个表中的列时,我遇到了一个“单行子查询返回多行”错误。这就是我所尝试的,以及它的各种变体:

UPDATE
  Table1
SET
    I_COVIEW_DEMO_ID =
(SELECT
    b.I_COVIEW_DEMO_ID
FROM Table1 a,
     Table2 b
WHERE a.I_HOUSEHOLD_NUMBER = b.I_HOUSEHOLD_NUMBER AND
      a.I_PERSON_NUMBER = b.I_PERSON_NUMBER AND
      a.T_RESOLVED_DATE = b.T_RESOLVED_DATE
GROUP BY b.I_COVIEW_DEMO_ID);

有什么建议吗?

根据我们对评论的讨论,这将是一个简单的PLSQL块,可以满足您的需要。我正在做直接从我的头没有测试,所以你可能需要修复一些错误

BEGIN

    FOR rs IN ( SELECT I_HOUSEHOLD_NUMBER,
                       I_PERSON_NUMBER,
                       I_COVIEW_DEMO_ID,
                       T_RESOLVED_DATE
                FROM Table2 ) LOOP

        UPDATE Table1
           SET I_COVIEW_DEMO_ID = rs.I_COVIEW_DEMO_ID
         WHERE I_PERSON_NUMBER = rs.I_PERSON_NUMBER
           AND I_HOUSEHOLD_NUMBER = rs.I_HOUSEHOLD_NUMBER
           AND T_RESOLVED_DATE = rs.T_RESOLVED_DATE;

    END LOOP;
    --commit after all updates, if there is many rows you should consider in
    --making commits by blocks. Define a count and increment it whithin the for
    --after some number of updates you commit and restart the counter
    COMMIT;

END;

我能够使用以下语句使其工作:

MERGE INTO table1 a
USING
(
   SELECT DISTINCT
      T_RESOLVED_DATE,
      I_HOUSEHOLD_NUMBER,
      I_PERSON_NUMBER,
      I_COVIEW_DEMO_ID
    FROM
      table2
) b
ON
(
  a.T_RESOLVED_DATE = b.T_RESOLVED_DATE
  AND a.I_HOUSEHOLD_NUMBER = b.I_HOUSEHOLD_NUMBER
  AND a.I_PERSON_NUMBER = b.I_PERSON_NUMBER
) WHEN MATCHED THEN
UPDATE SET
  a.I_COVIEW_DEMO_ID = b.I_COVIEW_DEMO_ID;

为相同的
日期、家庭号码和个人号码返回的多行将始终带来相同的
I\u COVIEW\u DEMO\u ID
?如果是,只需添加到子查询
和rownum=1
@JorgeCampos谢谢。问题在于,如果每个表中有3个不同的COVIEW_DEMO_ID,子查询将返回例如3行。当我将rownum=1添加到子查询中时,我只是用第一行的值更新列。我需要的是用子查询中返回的3的适当值来更新列,这就是我问的原因。Oracle无法执行更新,因为它不知道要使用哪个注册表从由于联接操作而出现的table2的3个结果中更新table1。因此,我认为一个小PLSQL块最适合您的问题。还有一个问题,您是否有可能在表2中有多个
日期、家庭号码和个人号码的注册表?因为如果是这样的话,你就有问题了,你必须找到另一个领域来进行研究unicity@JorgeCampos非常感谢。不,表2中不可能有一个日期、家庭号码和个人号码的多个记录。同一家庭和个人号码可能有多个日期。谢谢你的意见。我将关注PLSQL。谢谢你的建议。如果您对我是如何让它工作的感到好奇,请查看我的答案。@Lani1234伟大的解决方案+1为您提供这方面的帮助。我把所有的功劳都归功于我的同事,但我同意,伟大的解决方案。