1

を更新するI次の表があります。ベストプラクティスは、EAVテーブルの行

SubjectID AttributeID ValueID 
1   1   2 
1   1   3 
1   2   1 
2   1   3 
2   2   1 
1   3   1 

属性が(同じ属性については、上記の表では、複数の出演)複数の値を持つことができます。 同じ属性(異なる値)の外観の数に制限はありません。

Select * from Subject WHERE SubjectID=1 AND AttributeID=1 
--returns: 
SubjectID AttributeID ValueID 
1   1   2 
1   1   3 

後::

は、私はそう

前に、唯一の1 AttributeIDが1であるところにValueIDを変更するには、SubjectID = 1と件名を更新するためにwan't

Select * from Subject WHERE SubjectID=1 AND AttributeID=1 
--returns: 
SubjectID AttributeID ValueID 
1   1   1 

これは、オプションのパラメータ(すべてnullおよび提供された属性のみを更新する)、これは問題ではありません。私の質問は:

この行を更新するベストプラクティスは何ですか?私は実行可能な以下の答えを参照してください:

  1. 指定された属性を含むすべての行を削除し、新しいものを挿入します。
  2. (以上1は、同じ属性のために存在している場合ではない良い解決策)(指定されたサブジェクトのために)そのタイプの1つの属性のみが1つの更新がある場合

他のアイデア?

+0

あなたが他の場所で、各被験者の属性のペアのための複数の値を使用していますか?そうでない場合は、これらを削除し、再現を防ぐためにテーブルのデザインを更新することをお勧めします。これは、あなたがこのテーブルで書く*すべての*クエリ/ SPを簡素化します。これらのレコードを保持する必要がある場合は、削除してからトランザクション内に挿入します。 –

+0

私は本当に選択肢がありません、私はこの設計を実装しなければなりませんでした、ほぼ完了しました、アップデートについてまわるだけです.O – berthos

答えて

2

あなただけの1行を更新してから、そのような他人削除できます:set rowcount is deprecatedを使用して

set rowcount 1; 

update Subject 
    set ValuedID = 1 
where SubjectID = 1 
    and AttributeID = 1; 

set rowcount 0; 

delete Subject 
where SubjectID = 1 
    and AttributeID = 1 
    and ValuedID <> 1; 
+0

私はこれがうまくいくのか分かりません。更新は行に限定されません。Subject-Attribute-Value1,1,3,1,1の例から、両方とも1,1,1に更新されます。削除によってレコードが検出されません。これにより、要求された1の代わりにOPレコードが2つのレコードで残されます。 –

+0

CTE経由で[更新を制限する](http://stackoverflow.com/questions/3860975/sql-update-top1-row-query)設定された行数に設定します。 –

+0

いいえ、1行だけを更新してみてください! – IngoB

1

を、代わりにtop (n)を使用しています。 SQL Serverの将来のリリースでSET ROWCOUNTをDELETE、INSERTには影響しません使用して、およびUPDATEステートメント

重要

。新しい開発作業でDELETE、INSERT、およびUPDATEステートメントでSET ROWCOUNTを使用しないようにして、現在使用しているアプリケーションを変更する予定です。同様の動作をするには、TOP構文を使用します。詳細については、TOP(Transact-SQL)を参照してください。


update top (1) Subject 
    set ValueID = 1 
where SubjectID = 1 
    and AttributeID = 1; 

delete Subject 
where SubjectID = 1 
    and AttributeID = 1 
    and ValueID <> 1; 

rextesterデモ:http://rextester.com/ATDKI87027

リターン:

+-----------+-------------+---------+ 
| SubjectID | AttributeID | ValueID | 
+-----------+-------------+---------+ 
|   1 |   1 |  1 | 
|   1 |   2 |  1 | 
|   2 |   1 |  3 | 
|   2 |   2 |  1 | 
|   1 |   3 |  1 | 
+-----------+-------------+---------+ 
関連する問題