3

SQL Server 2005で、必要なすべてのテーブルに一意のIDがないDBを使用しています。回避策は、一意のIDが適用された類似のテーブルの別のセットを作成することです。

ここで、結合などの目的で、新しいIDの参照をテーブルの初期セットに戻したいと思います。(余談ですが、これらのテーブルは定期的に切り捨てられ、再入力されるため、回避策があります)。

つまり、Table2のIDを取得し、Table1のレコードに適切に関連付けたいと考えています。

私にとって難しいのは、Table1のレコードは、3つのフィールドを考慮した場合にのみ一意になるということです。

Table1にIDフィールドを追加してから、次のことを試しました。

UPDATE dbo.Table1

SET dbo.Table1.ID = dbo.Table2.ID

WHERE dbo.Table1.foo = dbo.Table2.foo
And dbo.Table1.bar = dbo.Table2.bar
And dbo.Table1.buzz = dbo.Table2.buzz

ただし、次のようなエラーが発生します。

Msg 4104, Level 16, State 1, Line 1
The multi-part identifier "dbo.Table2.foo" could not be bound.
Msg 4104, Level 16, State 1, Line 1
The multi-part identifier "dbo.Table2.bar" could not be bound.
Msg 4104, Level 16, State 1, Line 1
The multi-part identifier "dbo.Table2.buzz" could not be bound.

何かご意見は?

ありがとう。

4

3 に答える 3

3

これはあなたのために働くはずです:

UPDATE t
SET id = t2.id
FROM table1 t JOIN 
  table2 t2 ON t.foo = t2.foo AND
    t.bar = t2.bar AND
    t.buzz = t2.buzz

サンプルフィドルデモ

于 2013-02-23T21:29:53.237 に答える
1

クエリで表2を参照することはありません。次のことを試してください:

UPDATE dbo.Table1

SET ID = Table2.ID
FROM Table1 INNER JOIN Table 2 ON
Table1.foo = Table2.foo
And Table1.bar = Table2.bar
And Table1.buzz = Table2.buzz
于 2013-02-23T21:30:52.580 に答える
0

問題の回避策を見つけましたが、冗長データを作成し、データベースを非正規化して、パフォーマンスを低下させました。

1つのテーブルに一意のキーがないとおっしゃいました。次に、行を一意にする3つのフィールド、たとえば一意のキーを使用するのは難しいと述べました。これは、コンポジットキーとコンパウンドキーについて少し霧がかかっていることを示しています。オラクルのシステムで何度も見たことがありますが、この概念を初めて紹介したときは驚きました。

これらは理解して操作するのが難しい概念ですが、大規模な正規化された環境では非常に強力なツールになる可能性があります。私はそれらをブラッシュアップし、「古い方法」をもう一度見て、それがより理にかなっているかどうかを確認します。設計が劣っていたとしても、少なくとも十分な情報に基づいて設計を決定することができます。その後、パーマソリューションを作成できます。

複合キーを使用できなくなった問題は何でしたか?それは複雑ですか?それにこだわります!新しいテーブルを作成し、返された各行にデータのバッグを追加する前に、設計にかなり深刻なエラーが発生する必要があります。dbを正規化するために必要なことは何でも、ビューの使用とクエリを検討してください。

Oracleコンポジットキー

ウィキペディア(多くの情報ではありませんが、いくつか)

于 2013-02-23T22:38:05.060 に答える