2016-08-03 5 views
3

SQLを使用してExcelにカスタムODBCクエリを作成しています。テーブルの列が定義されているときにSQL結合が機能しなくなる

私は2つのテーブル 'TBL_CONTACT'と 'TBL_ADDRESS'を 'contactid'にINNER JOINとしています。これは両方に存在するカラムです。

すべての列を選択するとうまく動作しますが、表示する列の定義を開始すると機能しなくなります。

の作業コード:

SELECT * FROM "TBL_CONTACT" AS CONTACT 

INNER JOIN (SELECT * FROM "TBL_ADDRESS" AS ADDRESS) ADDRESS 
ON CONTACT.contactid = ADDRESS.contactid 

非作業コード:

SELECT CONTACT.contactid, CONTACT.fullname FROM "TBL_CONTACT" AS CONTACT 

INNER JOIN (SELECT * FROM "TBL_ADDRESS" AS ADDRESS) ADDRESS 
ON CONTACT.contactid = ADDRESS.contactid 

これが唯一の 'TBL_CONTACT' から 'contactid' と 'フルネーム' の列を示してから何かに参加していません " TBL_ADDRESS '。

例:

TBL_CONTACT 
contactid firstname fullname 
1001  John  John Smith 
1002  Tom   Tom Adams 

TBL_ADDRESS 
contactid line1  line2  postcode 
1001  3 Farm Ln Essex  AB1 1BA 
1002  1 Tim st Kent   CN2 2NC 

望ましい結果:

contactid fullname  contactid2 line1  line2 postcode 
1001  John Smith 1001  3 Farm Ln Essex AB1 1BA 
1002  Tom Adams 1002  1 Tim st Kent  CN2 2NC 

第一のコードは、その結果を以下与える:

contactid fullname 
1001  John Smith 
1002  Tom Adams 

contactid firstname fullname  contactid2 line1  line2 postcode 
1001  John   John Smith 1001  3 Farm Ln Essex AB1 1BA 
1002  Tom   Tom Adams 1002  1 Tim st Kent  CN2 2NC 

第二のコードは次のような結果になります

私はかなり新しいSQLですが、ここで何が間違っているのか分かりません。どんな助けでも大歓迎です!

+1

編集あなたの質問をし、サンプルデータと望ましい結果を提供します。

はそうちょうどあなたが望むすべてのフィールドクエリで、そしてもちろんSELECTのテーブルプレフィックスを使用しています。あなたの説明は、特に両方のクエリが機能するため、問題を伝える良い仕事をしません。 –

+0

'SELECT文のフィールド名の前にテーブル名を書く:' SELECT TBL_CONTACT.contactid、TBL_CONTACT.fullname、TBL_ADDRESS.contactid、TBL_ADDRESS.fullname' –

+0

カラムにエイリアス名を指定する –

答えて

1

を試してみてください。すべての列(最初のコードスニペットのような*)を選択すると、結合された表の列も選択されます。ただし、列を手動で選択する場合は、結合した表のどの列を定義する必要があります。

さんがあなたの表のTBL_CONTACTと結合テーブルTBL_ADDRESSからすべての列から2列にcontactidフルネームを持つようにしたいとしましょう:

SELECT `TBL_CONTACT`.`contactid`, `TBL_CONTACT`.`fullname`, `TBL_ADDRESS`.* FROM TBL_CONTACT 
INNER JOIN TBL_ADDRESS 
ON `TBL_CONTACT`.`contactid` = `TBL_ADDRESS`.`contactid` 

バッククォートはオプションです。

また、結合テーブルの列を指定することもできます。

+0

ありがとうございました!私は結合されたテーブルが元のselectステートメントに含まれなければならないことに感謝しませんでした。 – Tom

0

あなたの選択のために利用可能列にテーブル結果への参加この

//MySQL 
SELECT TC.contactid,TC.fullname,TA.`address_table_column` 
FROM TBL_CONTACT TC 
INNER JOIN TBL_ADDRESS TA 
ON TC.contactid = TA.contactid 

//SQL Server 
SELECT TC.contactid,TC.fullname,TA.[address_table_column] 
FROM TBL_CONTACT TC 
INNER JOIN TBL_ADDRESS TA 
ON TC.contactid = TA.contactid 
+0

? @Thomasはこのフィールドを全く言及していませんでした –

+0

私はちょうど別名がどのように動作するかを参考にしました –

+2

区切られた識別子の角括弧はMS SQL Server固有です。 MySQLにはバックティックがあります。 (ANSI SQLには二重引用符があります(例: '' address "')。 – jarlh

0

複数のテーブルに参加していて、いくつかのフィールドを選択した場合は、フィールドが属するテーブルに を指定する必要があります。

あなたの場合と同じように、両方のテーブルに同じフィールドを入れることができるので、mysqlはどのテーブルをフェッチするか分からないためです。

SELECT `TBL_CONTACT`.`contactid`,`TBL_CONTACT`.`fullname`,`TBL_ADDRESS`.`contactid` as contactid2,`TBL_ADDRESS`.`line1`,`TBL_ADDRESS`.`line2`,`TBL_ADDRESS`.`postcode` FROM `TBL_CONTACT`   
    INNER JOIN `TBL_ADDRESS` 
    ON `TBL_CONTACT`.`contactid` = `TBL_ADDRESS`.`contactid` 
+0

ありがとうございますが、これはまだ私に結合された列を与えていません - これが役立つ場合、元の質問にいくつかの詳細を追加しました。 – Tom

+0

"これは 'TBL_CONTACT'の 'contactid'と 'fullname'列のみを表示し、 'TBL_ADDRESS'から何も結合しません。" ..... Actucallyそれは参加しますが、もちろんあなたが選択したものを示しています....ちょうど 'SELECT'あなたが望むすべてのフィールド。私は私の答えを更新しました... –

+0

ありがとう、これは今私にとって意味があります。 – Tom

0
SELECT contact.*, ADDRESS.* FROM "TBL_CONTACT" contact INNER JOIN "TBL_ADDRESS" ADDRESS ON contact.contactid = ADDRESS.contactid; 
+1

これはOPの問題を解決するかもしれませんが、あなたが実際に修正したものにいくつかのコンテキストを提供するほうがよいでしょう。 – GergelyPolonkai

関連する問題