0

T_SUBJECTS (subject_id、date_of_birth) と T_ADMISSIONS (visit_id、subject_id、date_of_admission、age) の 2 つのテーブルがあります。年齢列を入学時の年齢で更新したい。更新クエリを作成し、「単一行のサブクエリが複数の行を返す」を取得しました。エラーは理解できましたが、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 に答える