0

SQLの質問があります。

tableAとtableBの2つのテーブルがあります。これらの2つのテーブルの構造はまったく同じです(簡略化されたバージョン)。

rowid : big int
name: character varying
enabled : boolean

2つの表:

tableA contains all the data and their enabled columns are all true.
tableB contains data in tableA that should be turned off (enabled set to false).

私の質問は、tableAのすべての行をtableBの行に置き換えるSQLステートメントをどのように記述できるかということです(または同様に、tableBに存在するすべての行の有効なフィールドをfalseに設定します)

私はPostgreSQLを使用しています。他のSQLタイプのSQLステートメントも歓迎します。

どうもありがとう。

4

3 に答える 3

3

これは可能です(ただし、構文はMSSQL、thx @コメントと互換性があります):

update tableA
   set tableA.enabled = false
from tableA
    inner join tableB on tableA.rowid = tableB.rowid
于 2012-08-11T18:12:13.573 に答える
2
UPDATE tbl_a a
SET    enabled = FALSE
FROM   tbl_b b
WHERE  a.rowid = b.rowid
AND    a.enabled IS NOT FALSE;

enabledが定義されている場合は、次NOT NULLのように簡略化します。

AND a.enabled;

ターゲット列の指定にテーブルの名前を含めないでください。たとえば、UPDATE tab SET tab.col=1は無効です。

  • PostgreSQLではUPDATE、句を使用して別のテーブルをステートメントに結合するFROM方が洗練されているだけでなく、を使用するよりも高速ですIN (subselect)。小さな更新ではほとんど問題になりませんが、大きな更新ではかなりの量になる可能性があります。でテストしEXPLAIN ANALYZEます。

  • 最後になりましたが、RDBMSの場合:空の更新は避けてください。テーブルAの行がすでにオフになっている場合は、更新を適用しないでください。データは変更されませんが、デッドローが作成されるため、トリガーが起動し、パフォーマンスとディスク容量が低下する可能性があります。

于 2012-08-11T23:45:11.313 に答える
2

これを達成する方法はたくさんあります。試す:

UPDATE TableA
SET Enabled = false
WHERE rowid IN
(SELECT rowid FROM TableB)
于 2012-08-11T18:11:41.157 に答える