2012-02-14 7 views
4

私は1対1の関係を持つ2つのテーブルを持っています。表1には、約4列の複合主キーがあります。 Table2の外部キーは、Table1の主キーに設定されています。私は、次のUPDATE句をしようとするとINNER JOINを主キーで使用できますか?

、私はエラーを取得しています:

UPDATE Table2 
SET column1 = fakeTable.c1 
FROM Table2 INNER JOIN 
    (
     SELECT Table1.primaryKey 
     , (Table1.column3 + Table1.column4) AS c1 
     FROM Table1 
    ) AS c1 
ON Table2.foreignKey = fakeTable.primaryKey 

私は、彼らが列であるかのようにキーを参照することは許されないのですか?

+3

あなたのエラーは何ですか? –

+1

ステートメントには 'fakeTable'への参照が1つしかないので、エラーの原因の1つです。 'AS fakeTable'や' set column1 = c1.c1'を書いていましたか? –

+0

SQL Server 2008. ONステートメントのfakeTableへの参照が不足しています。残念ながら、それはものを修正しませんでした。私は実際にキーを構成する列を参照する必要があると思う。私はキーの全体のポイントが列を連結することを避けることだと思った! – eek142

答えて

4

いいえ、すべてのフィールドを個別にリストする必要があります。しかし、あなたはコメントをあなたが持っているサブクエリ...

UPDATE 
    Table2 
SET 
    column1 = Table1.column3 + Table1.column4 
FROM 
    Table2 
INNER JOIN 
    Table1 
    ON Table2.foreignKey1 = Table1.primaryKey1 
    AND Table2.foreignKey2 = Table1.primaryKey2 
    AND Table2.foreignKey3 = Table1.primaryKey3 
    AND Table2.foreignKey4 = Table1.primaryKey4 

EDIT

応答を回避することができます:
- I thought the whole point of keys was to avoid having to concatenate columns!

キーは、デバイスの保存時間ではありません、彼らはデータ整合性デバイス。

プライマリキーは一意の識別子です。私はコンポジットにすることもできないこともできますが、重要なことは、ユニークでヌル入力ができないことです。

外部キーもデータ整合性デバイスです。データが別のテーブルのものを参照する場合、実際にはである必要があります。

+1

+1おそらくサブクエリが必要でないことを指摘するために... –

+0

これはうまくいきました!ありがとうございました。私はそれが過度に複雑になっていることを知っていました。キーを作成するために使用した列を連結した新しい列を各テーブルに作成する必要がありますか?それはすべてのANDチェックを避けるのに役立ちます。 – eek142

+3

@eek - 一般に、「いいえ」です。個々のフィールドが個別に何かを意味する場合は、あなたのままにしてください。同じフィールドに複数の項目を格納することは、SQLのアンチパターンであり、今後価値のある問題よりも多くの問題を引き起こすことがよくあります。私が主張している最も近いアプローチは、Table1に別のIDENTITYカラムを持ち、それに外部キーを付けることです。あなたはまだ4つの識別フィールドに一意のキーを置くことができます。これは代理キー(コンポジットキーの代わりに別のキー)と呼ばれます。 – MatBailie

2

いいえ、キーを列であるかのように参照することはできません。 PKとFKの両方の列をすべてサブ列selectjoinon節に列挙する必要があります。

+0

多くのAND演算子をリストする必要がないように列を連結することをお勧めしますか? – eek142

+1

@ eek142私はそれをお勧めしません...代わりに 'IDENTITY'列の2番目のDemsの提案をします。 –