web-dev-qa-db-ja.com

列Aから列Bへのデータを含む複数の行を更新しますか?

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'

データベース管理者自身ではなく、紛らわしい説明をお詫びします。

これに関するどんな助けでも大歓迎です。

5
SQLSavant

同じ行のdischarge_dtadmit_dtで上書きしたいだけの場合は、

UPDATE patient
   SET discharge_dt = admit_dt
 WHERE facility_id = 'X'
   AND pat_seq IN (<<query that returns the 60,000 keys>>)
8
Justin Cave

クロイド、説明は確かに紛らわしいです。

いくつかの仮定を述べ、それらに取り組みます。この価値を考慮してコメントアウトしてください。「そこ」に到達するまで答えを編集し続けます。対処?

行こう:

  • updateステートメントには、条件としてfacility_id='X'があります。

  • 割り当てのサブクエリには条件がまったくありません(pat_seqを除く)

  • したがって、私はそれを仮定して「予測」している:

    • pat_seqは患者を識別するためのキーです

    • admit_dtdischarge_dtは、どちらもdateではなく、date/timeタイプです。

    • patientテーブルのfacility_id列は、患者が(悲しい?)滞在中に送られたいくつかの施設を追跡します

    • 患者の場合、送付先の施設ごとに、次のような入院および退院の日時を追跡する行が必要です。

      • pat_seq: 0015, facility_id: AABB, admit_dt: 15:35, discharge_dt:16:45
      • pat_seq: 0015, facility_id: CCA1, admit_dt:16:45, discharge_dt:17:1
      • pat_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! */