更新期间子查询返回多行
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);
【讨论】:
以上是关于更新期间子查询返回多行的主要内容,如果未能解决你的问题,请参考以下文章