Column_aからcolumn_bに情報を更新するために必要な約60,000行があります。たとえば、60,000人の顧客は、departure_timeと一致するために到着時間を必要としています。私はこれを1つの行で実行でき、更新ステートメント内のネストされた選択ステートメントで機能することを理解しています。複数の行を更新しようとすると、60,000個の一意のキー識別子が必要になることに行き詰まっていると思います。
これは、レコードの1つを更新するために使用したもので、Oracle SQLを使用しています。
UPDATE patient
SET discharge_dt = (SELECT admit_dt
FROM patient
WHERE pat_seq = 'XXXXXX')
WHERE facility_id = 'X'
AND pat_seq = 'XXXXXX'
データベース管理者自身ではなく、紛らわしい説明をお詫びします。
これに関するどんな助けでも大歓迎です。
同じ行のdischarge_dt
をadmit_dt
で上書きしたいだけの場合は、
UPDATE patient
SET discharge_dt = admit_dt
WHERE facility_id = 'X'
AND pat_seq IN (<<query that returns the 60,000 keys>>)
クロイド、説明は確かに紛らわしいです。
いくつかの仮定を述べ、それらに取り組みます。この価値を考慮してコメントアウトしてください。「そこ」に到達するまで答えを編集し続けます。対処?
行こう:
update
ステートメントには、条件としてfacility_id='X'
があります。
割り当てのサブクエリには条件がまったくありません(pat_seq
を除く)
したがって、私はそれを仮定して「予測」している:
pat_seq
は患者を識別するためのキーです
admit_dt
とdischarge_dt
は、どちらもdateではなく、date/timeタイプです。
patient
テーブルのfacility_id
列は、患者が(悲しい?)滞在中に送られたいくつかの施設を追跡します
患者の場合、送付先の施設ごとに、次のような入院および退院の日時を追跡する行が必要です。
pat_seq: 0015, facility_id: AABB, admit_dt: 15:35, discharge_dt:
16:45pat_seq: 0015, facility_id: CCA1, admit_dt:
16:45, discharge_dt:
17:1pat_seq: 0015, facility_id: AAHD, admit_dt:
17:1, discharge_dt: NULL
アドミタンスのみが登録されているため、登録された新しいアドミタンスの場合、退院時間が次の施設内のアドミタンス時間と見なされる直前のエントリに対して更新アクションが必要です。
ブルズアイ?
さて、このシナリオでは、バッチでスケジュールされたタスクを想定して、次のことを行います。
UPDATE patient
SET discharge_dt = (
/*
For every entry past this, retrieve the least admit_dt, which shall identify the moment the pat_seq moved into the next facility
*/
SELECT MIN(admit_dt)
FROM patient pat_next_admit
WHERE pat_next_admit.pat_seq = patient.pat_seq
AND pat_next_admit.admit_dt > patient.admit_dt
)
WHERE discharge_dt IS NULL /* No need to process rows already processed! */