SQL Serverで、メイン、サブ1、サブ2、サブ3、サブ4というテーブルがあり、以下のSQLを実行すると、メインにあるすべてのデータ(10列)が抽出されます。

SELECT *
FROM メイン INNER JOIN
サブ1 ON メイン.name1=サブ1.id INNER JOIN
サブ2 ON メイン.name2=サブ2.id INNER JOIN
サブ3 ON メイン.name3=サブ3.id

しかし、上記のSQL文に追加して、

SELECT *
FROM メイン INNER JOIN
サブ1 ON メイン.name1=サブ1.id INNER JOIN
サブ2 ON メイン.name2=サブ2.id INNER JOIN
サブ3 ON メイン.name3=サブ3.id INNER JOIN
サブ4 ON メイン.name4=サブ4.id

とすると、メイン内の10列のうち、2列しか抽出されません。

サブ4を結合しても、一つ目のSQL文と同じ結果を抽出したかったのですが、どこがおかしいのでしょうか?
SQL文がまずいのか、サブ4のテーブル内容のせいなのか、SQL Serverの設定がおかしいのか、さっぱり見当がつきません。

足りない情報がありましたら補足いたしますので、どうぞよろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

"メイン"テーブルの"name4"列と"サブ4"テーブルの"id"列で一致する値が


2件しかないのではないでしょうか?
LEFT JOIN を使ってみてはいかがでしょうか?

通常3つ以上の結合をする場合は、括弧でくくって結合したテーブルを一つのテーブルと見なすようです。
<例>
select * from (foo INNER JOIN bar ON foo.a=bar.a)
INNER JOIN more ON foo.a=more.a
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
質問した後、よーくメインのテーブル内容を見てみたら、メイン.name4に、サブ4.id内にない値が入っているものがありました。これが原因で、抽出されなかったようです。
お騒がせしまして、申し訳ありませんでした。

お礼日時:2002/04/04 15:14

恐らくサブ4に対応するデータが2件しかないのだと思います。


SELECT *
FROM メイン INNER JOIN
サブ1 ON メイン.name1=サブ1.id INNER JOIN
サブ2 ON メイン.name2=サブ2.id INNER JOIN
サブ3 ON メイン.name3=サブ3.id LEFT JOIN
サブ4 ON メイン.name4=サブ4.id
とすると、サブ4のデータの有無に関わらず表示されます。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
ご指摘のとおり、メイン.name4の値が不正でした。
後から追加した列だったので、ちょっと混乱してしまったようです。
お騒がせしまして、申し訳ありませんでした。

お礼日時:2002/04/04 15:16

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QInner join と Left joinの明確な違いは?

Inner join と Left joinの違いがよくわかりません。
教えてください。

Aベストアンサー

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
4               NULL
5               NULL
6               NULL
の6レコードが出力されますが、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 INNER JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
の3レコードしか出力されません。

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3           ...続きを読む

QINNER JOINとwhere句

等結合のSQLを書く必要が出てきた場合、

INNER JOINとwhere句 どちらを使用されてるか教えて頂けないでしょうか?

私は、結合表の数が多くなってくると
INNNERのSQLはぱっと見て見にくいと想いWHEREを使っているのですが。
(何より、WHEREのほうが構文が簡単で・・・。)

よろしくお願いします。

Aベストアンサー

「Inner Join」と「Where」で、得られる結果が同じ場合であれば、
私は「Inner Join」を選択します。

Accessに触れ始めた頃から長らく、SQL文には触れずにデザイン
ビューのみで対応してきたという経緯もありますが
(→デザインビューなら結合線を追加するだけなので簡便)、
現在での最大の理由は、結果表示に要する時間が、Inner Join
の方が圧倒的に早かったため、です。
(レコードの多寡、インデックスの有無など、すべてのパターンを
 検証したわけではありませんが(汗))

QINNER JOINの有用性

INNER JOINの有用性

内部結合時に「INNER JOIN」と記述する有用性を教えてください。

内部結合を行なう際は、一般的には
FROM句にテーブル名を列挙し
WHERE句にテーブル間結合条件を列挙する
という形式をとります。少なくとも私は。

これをあえて「INNER JOIN」を使用して記述する有用性が分かりません。

私がぱっと思いつくレベルであれば、
「WHERE句に記述される条件の種類には、抽出条件とテーブル間結合条件の
2種類の条件が混在している。混乱を避ける為これを分離する」
と、屁理屈をこねることも可能ですが、
FROM句にテーブルと「INNER JOIN」記述を混在させるほうが
よっぽど分かりにくいように感じます。

あとさらに強いて言えば、「LEFT JOIN」にしたり「INNER JOIN」にしたりを
頻繁に切り替える場合とか。そんなこともまずないと思いますが…。


なので、「INNER JOIN」を使用する有用性をまったく感じません。
あえて使用する意味はあるのでしょうか?

質問は
・内部結合時に「INNER JOIN」を使用する有用性があるのか?
・有用性があるのであればどのような場合か?
です。よろしくお願いします。

INNER JOINの有用性

内部結合時に「INNER JOIN」と記述する有用性を教えてください。

内部結合を行なう際は、一般的には
FROM句にテーブル名を列挙し
WHERE句にテーブル間結合条件を列挙する
という形式をとります。少なくとも私は。

これをあえて「INNER JOIN」を使用して記述する有用性が分かりません。

私がぱっと思いつくレベルであれば、
「WHERE句に記述される条件の種類には、抽出条件とテーブル間結合条件の
2種類の条件が混在している。混乱を避ける為これを分離する」
と、屁理屈をこ...続きを読む

Aベストアンサー

本質的な差異はありません。

パフォーマンスに差が出るという事も
常識的にはありえないと思います。
今のオプティマイザはそんなに質は悪くありません。

20年以上前のDBもしくは無名で信用性の無いDBをあえて
使うという状況でもない限り気にしなくていいと思います。

Qinner joinでサブクエリ

SQLについてお教え頂けませんでしょうか?

在庫テーブル
・ID
・数量

データ
001,1
001,3
002,3
002,2
002,4
003,2

商品テーブル
・ID

データ
001
002
003
004

やりたいこと:
在庫テーブルには重複しているIDがあります。
商品テーブルには重複しているIDはありません。

在庫テーブルの重複を削除したIDと商品テーブルのIDをinner joinで結びたいと思います。

・select distinct ID FROM 在庫テーブル
・select ID FROM 商品テーブル

この2つのjoin方法がわかりません。

結果として、
001
002
003
を取得したいいです。宜しくお願いします。

ちなみに
select ID from 商品テーブル inner join 在庫テーブル 商品テーブル.ID = exists(select distinct ID from 在庫テーブル)
というコードを書きましたが、動きませんでした・・・抽出データが0件でした・・・

Aベストアンサー

 質問の例題が、あまりにも省略されている為に、正確な要件が解らなくなってしまっています。
 おそらく、商品テーブルにも在庫テーブルにも、そのほかのフィールドがあるはずですよね。そうで無いと、在庫テーブルはレコードの特定が出来ませんし、商品テーブルに至っては存在価値を疑ってしまいますので・・・

 で、質問の結合方法も、そのほかのフィールドがらみで方法が変わってきそうです。
 本当に、質問内容だけでしたら、一番単純な解は、
select distinct ID from 在庫テーブル
 です。結合の必要なんてありません。

 こんなのも、いちおうあり・・・ですが・・・
 select distinct z.ID from 商品テーブル s join 在庫テーブル z on s.ID=z.ID
 これで、少なくとも、商品テーブルに存在する商品IDのうち、在庫テーブルに存在する商品の重複の無いIDが取得できます。が・・・普通、商品テーブルに存在しない商品IDてのが想像しがたいので、意味があるかどうか・・・

 普通は、この類のテーマだと、
select s.ID, sum(z.数量) from 商品テーブル s join 在庫テーブル z on s.ID=z.ID
group by s.ID
 等とやって、「商品の在庫量が知りたいです」となるんですけど・・・

 さて、いったい何がやりたいのでしょうか?
 「いろいろとやりたいこと」の内容を書かれた方が、的確な答えが返ってくると思います。

 質問の例題が、あまりにも省略されている為に、正確な要件が解らなくなってしまっています。
 おそらく、商品テーブルにも在庫テーブルにも、そのほかのフィールドがあるはずですよね。そうで無いと、在庫テーブルはレコードの特定が出来ませんし、商品テーブルに至っては存在価値を疑ってしまいますので・・・

 で、質問の結合方法も、そのほかのフィールドがらみで方法が変わってきそうです。
 本当に、質問内容だけでしたら、一番単純な解は、
select distinct ID from 在庫テーブル
 です。結合の必要...続きを読む

QLeft Join/Right Join の意味

Left Join/Right Join を、accessクエリのデザイン画面では使っています。

SQLではLeft Join/Right Join となりますが、この「右」「左」という言葉を使う意味を教えていただけないでしょうか。

#なぜ「右」「左」というのかよくわからないため。
#まことに初歩的な質問だと思いますが。

Aベストアンサー

本来この構文を考え出した人の意図と合っているのかは知りませんが、私なりの解釈は、どちらのテーブルを元にして結合しているかだと思っています。
すなわち、A Join BのA(左)を元にするかB(右)を元にするかです。

例えば、

テーブル1 Left Join テーブル2 On 結合条件
なら、テーブル1(左)を元にしてテーブル2を結合条件に従って結合

テーブル1 Right Join テーブル2 On 結合条件
なら、テーブル2(右)を元にしてテーブル1を結合条件に従って結合

だから、

テーブル1 Left Join テーブル2 On 結合条件
テーブル2 Right Join テーブル1 On 結合条件
は、結合条件が同じなら元にしているテーブルは同じなので同じ結果を返す。

s-holmesさんがこの考え方で納得していただけるかは分かりませんが、以前私も悩んだことがあったので参考意見ぐらいにしていただけるとうれしいです。


人気Q&Aランキング

おすすめ情報