PostgreSQLで更新+結合する方法は?



How Update Join Postgresql



この記事の翻訳元: PostgreSQLで更新+結合を行う方法は?

基本的に、私はこれをしたいです: 基本的に、私はこれをしたいです:



update vehicles_vehicle v join shipments_shipment s on v.shipment_id=s.id set v.price=s.price_per_vehicle

これはMySQL(私のバックグラウンド)で機能すると確信していますが、postgresでは機能しないようです。 これはMySQL(私のバックグラウンド)で使用できると確信していますが、postgresでは機能しないようです。 私が得るエラーは次のとおりです。 私が得るエラーは次のとおりです。

ERROR: syntax error at or near 'join' LINE 1: update vehicles_vehicle v join shipments_shipment s on v.shi... ^

確かにこれを行う簡単な方法はありますが、適切な構文が見つかりません。 もちろん、これを行う簡単な方法はありますが、正しい構文が見つかりません。 では、これをPostgreSQLでどのように記述しますか? では、PostgreSQLでこのコードをどのように書くのでしょうか?




#1階

参照: https://stackoom.com/question/X1Eu/PostgreSQLで更新する方法-参加する


#2階

私の例でもう少し説明しましょう。 私の例でもっと説明しましょう。

タスク:正しい情報。Abiturients(中等学校を卒業しようとしている学生)が学校の証明書を取得するよりも早く大学に申請書を提出した場合(はい、発行されたよりも早く証明書を取得しました(証明書の日付が指定されています)。証明書の発行日に合わせて、アプリケーションの提出日を増やします。 タスク:正しい情報、つまり、進取の気性のある人(中学校を卒業しようとしている学生)は、学校の証明書を受け取る前に申請書を提出します(はい、証明書を受け取る前に(指定された証明書の日付に従って) )証明書を取得するため、証明書の発行日に合わせて申請書の提出日を増やします。



したがって。 それによって。 次のMySQLのようなステートメント: MySQLに似た次のステートメント:

UPDATE applications a JOIN ( SELECT ap.id, ab.certificate_issued_at FROM abiturients ab JOIN applications ap ON ab.id = ap.abiturient_id WHERE ap.documents_taken_at::date

このようにしてPostgreSQLのようになります このようにしてPostgreSQLのようになります

UPDATE applications a SET documents_taken_at = b.certificate_issued_at -- we can reference joined table here FROM abiturients b -- joined table WHERE a.abiturient_id = b.id AND -- JOIN ON clause a.documents_taken_at::date

ご覧のとおり、元のサブクエリJOINON句はWHEREの1つになりましたANDによって結合される条件変更なしでサブクエリから移動された他の人と。 ご覧のとおり、元のサブクエリJOIN of ON句はWHERE条件の1つになりました、AND他の条件と組み合わせて、これらの条件はから削除されました変更なしのサブクエリ。 そして、JOINする必要はもうありません。それ自体を含むテーブル(サブクエリの場合と同様)。 そして、テーブル自体をJOINで接続する必要がなくなりました。 (サブクエリの場合と同じように)。


#3階

実際にやりたい人のためにJOIN次のものも使用できます。 本当に欲しい場合JOIN次のものも使用できます:

UPDATE a SET price = b_alias.unit_price FROM a AS a_alias LEFT JOIN b AS b_alias ON a_alias.b_fk = b_alias.id WHERE a_alias.unit_name LIKE 'some_value' AND a.id = a_alias.id

SETでa_aliasを使用できます必要に応じて、等号の右側のセクション。 必要に応じて、パーツでSET使用a_aliasを使用できます。 等号の左側のフィールドは、元の「a」テーブルからのものと見なされるため、テーブル参照は必要ありません。 等号の左側のフィールドは、元の「a」テーブルからのものと見なされるため、テーブルを参照する必要はありません。


#4階

さあ: それが始まった:

update vehicles_vehicle v set price=s.price_per_vehicle from shipments_shipment s where v.shipment_id=s.id

私がそれを作ることができたので簡単です。 私にできることは簡単です。 みんなありがとう! 皆さん、ありがとうございました!

これを行うこともできます: これを行うこともできます:

-- Doesn't work apparently update vehicles_vehicle set price=s.price_per_vehicle from vehicles_vehicle v join shipments_shipment s on v.shipment_id=s.id

ただし、車両テーブルが2回あり、エイリアスは1回しか許可されておらず、「set」部分でエイリアスを使用することはできません。 ただし、車両テーブルが2回あり、エイリアスは1回しか許可されておらず、[設定]セクションでエイリアスを使用することはできません。


#5階

NameのMiddle_Nameフィールドを使用してName3テーブルのMid_Nameを更新する単純なSQLを次に示します。 これは、NameのMiddle_Nameフィールドを使用してName3テーブルのMid_Nameを更新する単純なSQLです。

update name3 set mid_name = name.middle_name from name where name3.person_id = name.person_id

#6階

この状況では、マーク・バイアーズの答えが最適です。 この場合、マークバイアーズの答えが最適です。 ただし、より複雑な状況では、ROWIDと計算値を返すselectクエリを取得して、次のように更新クエリに添付できます。 より複雑な状況では、次のようにselectクエリを使用して行IDと計算値を返し、それを更新クエリに追加できます。

with t as ( -- Any generic query which returns rowid and corresponding calculated values select t1.id as rowid, f(t2, t2) as calculatedvalue from table1 as t1 join table2 as t2 on t2.referenceid = t1.id ) update t1 set value = t.calculatedvalue from t where id = t.rowid

このアプローチでは、選択したクエリを開発してテストし、2つのステップでそれを更新クエリに変換できます。 このメソッドを使用すると、選択したクエリを開発およびテストし、2つのステップで更新クエリに変換できます。

したがって、あなたの場合、結果のクエリは次のようになります。 したがって、あなたの場合、結果のクエリは次のようになります。

with t as ( select v.id as rowid, s.price_per_vehicle as calculatedvalue from vehicles_vehicle v join shipments_shipment s on v.shipment_id = s.id ) update vehicles_vehicle set price = t.calculatedvalue from t where id = t.rowid

列エイリアスは必須であることに注意してください。そうでない場合、PostgreSQLは列名のあいまいさについて文句を言います。 列のエイリアスが必要であることに注意してください。そうでない場合、PostgreSQLは列名のあいまいさについて文句を言います。