1

今朝、私はこれと非常によく似た質問をしましたが、見事に答えられました。

ただし、プレイを確認した後、実際の問題はその質問で説明したものよりも少し複雑であることがわかりました. 基本的に、3 つの Postgres テーブルがあります。

[myschema].[animals]
--------------------
animal_id
animal_attrib_type_id (foreign key to [myschema].[animal_attrib_types])
animal_attrib_value_id (foreign key to [myschema].[animal_attrib_values])

[myschema].[animal_attrib_types]
--------------------------------
animal_attrib_type_id
animal_attrib_type_name

[myschema].[animal_attrib_values]
--------------------------------
animal_attrib_value_id
animal_attrib_value_name

だから、私は次のanimalような記録を持っているかもしれません:

[myschema].[animals]
--------------------
animal_id = 458
animal_attrib_type_id = 38
animal_attrib_value_id = 23

対応するanimal_attrib_type(id = 38) には、次の値があります。

[myschema].[animal_attrib_types]
--------------------------------
animal_attrib_type_id = 38
animal_attrib_type_name = 'animals.should-make-noise'

対応するanimal_attrib_value(id = 23) には次の値があります。

[myschema].[animal_attrib_values]
--------------------------------
animal_attrib_type_id = 23
animal_attrib_type_name = 'true'

したがって、同じanimalレコードに複数のタイプ/値のペアを含めることができます。この場合、動物はanimal_attrib_type_name" animals.should-make-noise" に対応するanimal_attrib_value_name" " を持っていましたtrue

実行時には、animal_id(つまり 458) とanimal_attrib_type_id(つまり 38) しかありません。与えられanimal_attrib_value_nameたものだけに対応する適切なものを検索し、その値を静的テキスト (「true」または「false」) に更新できるようにする必要があります。すべて同じ UPDATE ステートメント内から。animal_idanimal_attrib_type_id

上記の質問の答えは、私が述べた問題に対して正しかったのですが、同じ動物に 0+ 型/値の組み合わせがあるため、実際には少し異なる SQL ステートメントが必要です。前もって感謝します!

4

2 に答える 2

7

FROMPostgreSQLUPDATEコマンドの句を利用します。これは通常、よりクリーンで高速です。

UPDATE animal_attrib_values av
SET    animal_attrib_value_name = 'true'
FROM   animals a 
WHERE  a.animal_id = 458 
AND    a.animal_attrib_type_id  = 38
AND    a.animal_attrib_value_id = av.animal_attrib_value_id;

は既にわかっているのでanimal_attrib_type_id、3 番目のテーブルを含める必要はまったくありませんanimal_attrib_types。必要に応じて追加で参加することもできます...

SETまた、内の項目をテーブル修飾しないでくださいUPDATE。それは構文エラーです。上記のページのマニュアルを引用します:

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

大胆強調鉱山。

于 2012-09-26T18:50:52.183 に答える
1

以下のSQLは、あなたが求めていることを行うはずです:

UPDATE animal_attrib_values aav
SET animal_attrib_value_name= 'true'
WHERE aav.animal_attrib_value_id = (
    SELECT a.animal_attrib_value_id 
    FROM animals a 
    WHERE a.animal_id = 458 
        AND a.animal_attrib_type_id  = 38
)
;
于 2012-09-26T13:24:52.993 に答える