更新期间子查询返回多行

Posted

技术标签:

【中文标题】更新期间子查询返回多行【英文标题】:Subquery returning multiple rows during update 【发布时间】:2014-10-03 16:14:02 【问题描述】:

我有两个表 T_SUBJECTS (subject_id, date_of_birth) 和 T_ADMISSIONS (visit_id, subject_id, date_of_admission, age)。我想用入学时的年龄更新年龄列。我编写了更新查询并得到“单行子查询返回多行”。我理解错误,但认为 where exists 子句可以解决问题。下面是查询。

UPDATE
  t_admissions
SET
  t_admissions.age =
  (
    SELECT
      TRUNC(months_between(t_admissions.date_of_admission,
      t_subjects.date_of_birth)/12)
    FROM
      t_admissions,
      t_subjects
    WHERE
      t_admissions.subject_id           = t_subjects.subject_id
    AND t_admissions.age = 0
    AND t_admissions.date_of_admission IS NOT NULL
    AND t_subjects.date_of_birth       IS NOT NULL
  )
WHERE
   EXISTS
  (
    SELECT
      1
    FROM
      t_admissions, t_subjects
    WHERE
      t_admissions.subject_id = t_subjects.subject_id
  ); 

【问题讨论】:

当有多个点击时你希望发生什么?只需选择可用值中的任何值?完全忽略重复的行? 我不能忽略多次点击。同一科目可能有多次录取,录取日期不同,所以录取年龄会有所不同,我需要更新这些记录。 【参考方案1】:

问题是您在 SET 子句中的子查询返回多行。 拥有 WHERE 子句只会过滤哪些记录会被更新,而不会过滤其他任何内容。 此外,您的 where 子句将始终返回 true 或始终返回 false。

您应该研究如何正确进行相关更新:https://***.com/a/7031405/477563

【讨论】:

【参考方案2】:

如上述链接中所建议的,我需要相关更新。请参阅下面的答案。

UPDATE
  (
    SELECT
      t_admissions.visit_id,
      t_admissions.date_of_admission doa,
      t_admissions.age age,
      t_subjects.date_of_birth dob
    FROM
      t_admissions,
      t_subjects
    WHERE
      t_admissions.subject_id = t_subjects.subject_id
    AND t_admissions.age      = 0
    AND t_admissions.date_of_admission IS NOT NULL
    AND t_subjects.date_of_birth IS NOT NULL
  )
SET
  age = TRUNC(months_between(doa,dob)/12);

【讨论】:

以上是关于更新期间子查询返回多行的主要内容,如果未能解决你的问题,请参考以下文章

更新语句中的“单行子查询返回多行”

无法更新表中的列 它返回单行子查询返回多个

错误(单行子查询返回多行)

Oracle 单行子查询在使用嵌套子查询时返回多行

ORA-01427 单行子查询返回多行 - 如何解决?

收到“单行子查询返回多行”错误