0

我有两个表 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
  ); 
4

2 回答 2

1

问题是您在 SET 子句中的子查询返回多行。
有一个 WHERE 子句只会过滤哪些记录得到更新,没有别的。
此外,您的 where 子句将始终返回 true 或始终返回 false。

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

于 2014-10-03T16:20:11.973 回答
1

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

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);
于 2014-10-03T18:16:11.440 回答