2017-01-12 7 views
0

私はTable1からTable3へのデータのリンクに向けて取り組んでいます。私はMicrosoft SQL Serverを使用しています。私はあまりにも経験はありませんが、私の研究とテストから、私は信じているジョインズを使用するべきです。 私は表1の名前に基づいてTable3の列をすべて取得しようとしています。このパスは、名前から名前まで、ステートコードからステートコードまでです。これを動作させるにはどうしたらいいですか?私も試行されたコードを提供しました。3つのテーブル間でデータを正しく取得する

シナリオの記述例:表3に40行あり、行のうちの10行に220の状態コードがあるとします。ボブは状態コード220にあります。次に、statecodeのtable3に10行を表示する必要があります名前が 'Bob'なので220の

表1列

name | email | phone 

表2列

name | statecode | company 

表3列

amount | statecode | average 

未遂コード

select table3.* 
from table3 
inner join table2 
on table3.statecode = table2.statecode 
inner join table1 
on table2.name = table1.name 
where table1.name = 'Bob' 
+0

サンプルが表示されているのではなく、IDのリンクが強調表示されている可能性があります。彼はあまり経験していないOP状態を見ています。参照のためにこれを参照してください:http://meta.stackoverflow.com/questions/341391/answering-a-question-with-a-different-approach-altogether – Tanner

答えて

0

私はTSQLスタイリングを採用したSQL Serverについて言及しているので、テーブルは一般的な名前の列に関連していると想定していますが、そうである必要はありません。より伝統的なスキーマでは、一部またはすべてのテーブルに、そのテーブルのキーとして機能するId列があることが期待されます。外部キーの名前はTableIdとなります。キーはシンプルなタイプ、おそらくInt32を持っていて、迅速なインデックスと制約を可能にします。

SELECT 
      C.[Amount], 
      C.[StateCode], 
      C.[Average] 
    FROM 
      [Table1] A 
     JOIN 
      [Table2] B 
       ON A.[Name] = B.[Name] 
     JOIN 
      [Table3] C 
       ON B.[StateCode] = C.[StateCode] 
    WHERE 
      A.[Name] = N'Bob'; 

私はオプションのキーワードを省略しました。誰が必要ですか?引用符で囲まれた識別子が含まれています。 []、これはオプションですが、良い方法です。使用されるケースはMSDNで広範囲に使用されているものと一致し、空白の使用は普通ではありませんが、読みやすさに役立ちます。

+0

これは、複数の 'Bobがtable1にそれは1ボブしか行いませんか?これにより、table3の複数の行が同じにならないようになります。 – Brad

+0

@Brad、 '' Bob''が 'table1'に複数ある場合、' name'は候補キーではないので、データベースを少し再設計する必要があります。私たちは、データベースを設計するときに、正常化を達成しようとしています。 3NF。これは、https://en.wikipedia.org/wiki/Boyce%E2%80%93Codd_normal_form内の全体的なトップインです。あなたの特定の例では、 '[Id] IDENTITY'カラムを' table1'に追加してサロゲートキーとして機能させるのが理にかなっています。これは 'table2'の外部キーとして動作するはずです。 '[Table1Id]' – Jodrell

0

コードにはどのような問題がありますか?私は明示的ではなく表3からのデータのみよりも、あなたはすべての列を見たいと述べました

select t1.*, t2.*, t3.* 
from 
table1 t1 
join table2 t2 on t1.name = t2.name 
join table3 t3 on t2.statecode = t3.statecode 
where t1.name = 'Bob'; 

- とI:ここで

はうまく動作するはずです(非常にマイナー)の書き換えであり、いくつかのテーブルエイリアス(t1、t2、t3)を用意しています。これはSQLでの作業の構造化に役立ちます。

0

まず、膨大な量のレコードで作業しているときに文字列フィールドを使用する結合が遅すぎる可能性があることに注意してください。あなたが与えられたテーブルの構造を変えることができるのであれば、私はそのようなことだろう。

表1列

IDTable1(主キー)|名前|電子メール|電話

表2列

IDTable2(主キー)| FK_IdTable1(Table1への外部キー)| | 州コード|会社

表3列

IDTable3(主キー)| FK_IdTable2(Table2への外部キー)|金額 州コード|平均

次に、Joinを使用してテーブル間のリレーションを宣言するだけです。

select table3.* 
from table3 t3 
    inner join table2 t2 
on t3.FK_IdTable2= t2.IDTable2 
    inner join table1 t1 
on t1.IDTable1 = t2.FK_IdTable1 
where t1.name = 'Bob' 
関連する問題