使用INNER JOIN进行Oracle UPDATE

时间:2015-07-09 15:26:23

标签: sql oracle join sql-update

我需要从另一个表列的MAX值更新表列的值。

这个question正是我的情况,我有一个表,我需要从中获取MAX值,然后更新表newTable的datetime列,该表的MAX datetime值为所有匹配的home值newtable的。

根据链接线程的数据,我提出了以下更新声明

UPDATE newTable s
SET s.datetime = (
    SELECT tt.timedate
    FROM topten tt
    INNER JOIN
        (SELECT home, MAX(datetime) AS MaxDateTime
        FROM topten
        GROUP BY home) groupedtt 
    ON tt.home = groupedtt.home 
    AND tt.datetime = groupedtt.MaxDateTime WHERE s.home = tt.home);

这个问题是我收到以下错误

SQL Error: ORA-01427: single-row subquery returns more than one row

我还应该指出topten.home并不是唯一的,而newTable.home是。

我可以通过添加如下的rownum语句来消除错误:

UPDATE newTable s
SET s.datetime = (
    SELECT tt.timedate
    FROM topten tt
    INNER JOIN
        (SELECT home, MAX(datetime) AS MaxDateTime
        FROM topten
        GROUP BY home) groupedtt 
    ON tt.home = groupedtt.home 
    AND tt.datetime = groupedtt.MaxDateTime WHERE s.home = tt.home AND rownum <= 1);

或设置MAX

的子查询
UPDATE newTable s
SET s.datetime = (
    SELECT MAX(tt.timedate)
    FROM topten tt
    INNER JOIN
        (SELECT home, MAX(datetime) AS MaxDateTime
        FROM topten
        GROUP BY home) groupedtt 
    ON tt.home = groupedtt.home 
    AND tt.datetime = groupedtt.MaxDateTime WHERE s.home = tt.home);

但是我不太明白为什么需要这样做,因为原始子查询中的MAX语句应该确保每个家庭只有1个条目,我也不知道这些变化的影响究竟是什么(虽然初步测试表明它们是似乎工作)

我过度复杂吗?

1 个答案:

答案 0 :(得分:3)

为什么不简单......

UPDATE newTable s
SET s.datetime = (
    SELECT COALESCE(MAX(tt.timedate), <put your default date here>)
    FROM topten tt
    WHERE s.home = tt.home)

如果我接受你的原始陈述,我删除了内连接,如下所示:

UPDATE newTable s
SET s.datetime = (
    SELECT tt.timedate
    FROM topten tt
    WHERE s.home = tt.home);

...您将看到子查询可以为相同的home值返回多行。因此,我们假设上面的每个home值返回5行,然后使用MAXGROUP BY查询添加内部联接,该查询确实每home返回一行,它仍然会返回总共5 x 1行。它不会神奇地将行数减少到1