2017-07-25 4 views
0

継承関係をモデル化するためのテーブルがあります。それはとてもすべてのプロパティの列を持つ指向列だとのようになります。mainidとサブID> 0と一致する任意の行に親に関連している同じmainidとサブID = 0の任意の行と継承ベーステーブルのUPDATEステートメント

mainid, subid, prop1, prop2, etc. 

すべての行であります。このように:

100, 0, 'abc', 123 

100, 1, NULL, 456 

(100,1)(100,0)の子であり、(100,1)ためprop1を照会することは私に'abc'を与える必要がありますし、(100,1)ためprop2を照会することは私に456を与える必要があることを意味します。

を更新したい場合は、NULLフィールドにしたいと思いますが、更新値が'abc'(parent.prop1フィールドと一致)の場合は、このフィールドを作成します。このためにできる簡単な更新クエリはありますか?私は複数のクエリでこれを行うことができますが、可能であれば、1つの更新クエリと複数のフィールドを一度に更新するために実行したいと考えています。(eg update (100,1).prop1='abc', (100,1).prop2=789, etc.)

これは標準的なSQL(特定のSQLエンジン)

+0

あなたはどのようなデータベース・サーバを使用していますか? –

+0

できません。一度に1行しか更新できません。 – Hogan

+0

@Hogan、1行(子行)を更新したいだけですが、入力値が親と一致する場合はその値をNULLにする必要があります。そうでない場合は、入力値を親のオーバーライドにします。したがって、(100,1).prop1 = 'abc'(100,1).prop1 = 'xyz(100,1).prop1 =' abc ' 'は単に' xyz 'になります。 – rottyguy

答えて

1

ケース式と依存サブクエリを使用して、彼らは標準ANSII SQLの一部であり、それらはほとんどすべてのデータベースでサポートされています:

UPDATE table t1 
SET prop1 = CASE WHEN EXISTS 
       (SELECT * FROM table t2 
        WHERE t1.mainid = t2.mainid 
        AND t2.subid = t1.subid - 1 
        AND t2.prop1 = 'abc' 
       ) 
      THEN NULL ELSE 'abc' END 
WHERE t1.mainid = 100 AND t1.subid = 1 
+0

nice。 Nのプロパティ(prop1、prop2などの更新)に対してこれを行う一般的な方法はありますか?また、これは常に2つのクエリをとにかく行うのですか? – rottyguy