- ベストアンサー
- すぐに回答を!
複数のテーブルに対してのleft join
前回他の方が質問していますが、、、 T1、T2、T3、T4がありまして T1が軸のテーブルです。 その場合 select T1.a,T2.b,T3.c from T1,T2,T3 left join T4 on T1.x = T2.x and T2.xx = T3.xx and T2.xxx = T4.xxx where T4.x is null というふうなSQLを発行しようとしたのです。 しかし「onが無効」と怒られました。 ご存知の方教えてください。 HPなどご存知の方お願いいたします。 DB2/UDBです。
- chika_chan
- お礼率55% (37/67)
- 回答数1
- 閲覧数5356
- ありがとう数4
質問者が選んだベストアンサー
- ベストアンサー
- 回答No.1
- stork
- ベストアンサー率34% (97/285)
DB2を使用したことが無いのでSQL一般論で回答します。 onは、T3とT4に対しての結合条件指定になっているのにに他のテーブルの結合条件を示しているのでエラーになっています。 from (((T1 inner join T2 on T1.x=T2.X) inner join T3 on T2.XX = T3.XX) left outer join T4 on T2.XXX = T4.XXX) でいかがですか。 (質問からは、T1,T2,T3の結合条件が読み取れないので等結合としました。) もしくは、whereで結合すればいいと思います。
関連するQ&A
- left join が3つ以上のとき
例えば select * from ((t1 left join t2 on t1.a=t2.a)left join t3 on t1.a=t3.a) where b.t1='y'; という風にカッコがついて記入しにくくなります。 4つの場合はさらに深刻です。 簡単な記法はないのでしょうか?
- ベストアンサー
- PostgreSQL
- Accessの表結合SQL
AccessのSQLで外部結合を複数使うと SQLがエラーになります。 クエリで確認してエラーにならない様につくってみましたが、意図する事をやろうとするとエラーになります。 どこが悪いか教えていただけませんか?おそらくSQLサーバーでは余裕で通るSQLだと思うのですが。。。 SQL = SELECT * FROM T1 LEFT JOIN T2 ON T1.A = T2.A LEFT JOIN T3 ON T1.B = T3.B LEFT JOIN T4 ON T1.C = T4.C AND T4.D = iNum WHERE T1.E = 'iNum' やりたいのはT1を基準にT2,T3,T4からデータを引っ張ってきたい。その条件としてT4から引っ張ってくるのは T4.DがiNumである事、基準となるT1のT1.EがiNumである事です。 Accessでは"AND T4.D = iNum"がだめで、 WHERE区に書くと外部結合にもかかわらずT4.D = iNumのデータしか抽出されなくなる。(T1.C = T4.CのデータがT4.D = iNumでなくてもT1のデータが抽出されなくてはならない。) さらに SQL = SELECT * FROM ((T1 LEFT JOIN T2 ON T1.A = T2.A) LEFT JOIN T3 ON T1.B = T3.B) LEFT JOIN T4 ON T1.C = T4.C AND T4.D = iNum WHERE T1.E = 'iNum' こんな括弧が必要になってくる。 これだとT1とT2を外部結合した結果をT3と外部結合して さらにその結果をT4と外部結合しているという意味あいになってしまって、意図が違うのですが。。 結果は同じなのでAccessに譲ってやってもいいのですが 前者はT1で抽出されなければならないデータが抽出されないので困ります。 よろしくお願いいたします。
- 締切済み
- その他(データベース)
- Left Joinについて
Left Joinについて select * From shohin left join meisho on sh03 = me02 and me01 = 1 where **** select * From shohin left join meisho on sh03 = me02 where me01 = 1 left joinの中に me01 = 1があるパターンとwhere句に me01 = 1 があるパターンで検索結果が変わってくる具体的にどう変わるのでしょうか 良く理解ができていないので教えてください
- ベストアンサー
- SQL Server
- 少し複雑な left join
まだデーターベースを独学で始めて数ヶ月の初心者です。 以下(3行目のleft join)の記述では動かないのですが、どのように 記述したらよいのでしょうか? やりたい内容は3行目にあるようにbookedというテーブルの中のdateが 2013-06-05だけ抽出した形のテーブルを、timeTplというテーブルとleft join させたいです。 1 "select * 2 from 3 timeTpl as t left join (SELECT * FROM booked where date ="2013-06-05") as b 4 on 5 t.start >= b.startTime and t.start < b.finishTime || 6 t.finish > b.startTime and t.finish <= b.finishTime 7 where 8 t.time > 9 (select start 10 from class as c left join member as m 11 on c.className = m.class 12 where m.name = '$name') 13 ) 14 "; よろしくお願いします。
- 締切済み
- MySQL
- どちらのLEFT JOINが早いでしょうか?
下記2つのテーブルがあったとします。 ・大テーブルA 7000万件 ・小テーブルB 2000件(※現在はWHERE句で指定すると1件) をJOINする場合、下記のどちらの方法が望ましいでしょうか? 案1)子テーブルを親とする方法 テーブルA(ON句により1件~2000件) LEFT JOIN 7000万件のテーブルB 案2)親テーブルを子とする方法 7000万件のテーブルB LEFT JOIN テーブルA(ON句により1件~2000件) 又、LEFT JOINの、ON句で条件を絞るのと、 WHERE句で条件を絞るのではどちらが好ましいでしょうか?
- ベストアンサー
- MySQL
- LEFT JOINの記述の仕方について
お世話になっております。 LEFT JOINの記述の仕方でご確認したい事があります。 ご教授頂けますようお願いいたします。 【ご質問内容】 以下のようなSQLをLEFT JOINを使用して記述する場合、 どのように記述すればよろしいのでしょうか? SELECT A.* FROM A B C WHERE A.COLUMN1 = B.COLUMN1 AND B.COLUMN2 = C.COLUMN2(+) AND B.COLUMN3 = C.COLUMN3(+) AND A.COLUMN4 = C.COLUMN4(+) ;
- 締切済み
- MySQL
- LEFT JOINの条件式で=’’を使用した場合
以下のSQLを実行した場合、レコードを1件取得して欲しいのですが、 なぜか上手く取得できません。 ご存知の方がいらっしゃいましたら、教えてください。 -- SQL1 --------------------------------------------------- select MAIN.MAIN_NAME, nvl(SUB1.CODE is NULL, 0) as SUB_CODE1, nvl(SUB2.CODE is NULL, 0) as SUB_CODE2 from MAIN_TABLE MAIN left join SUB_TABLE SUB1 on MAIN.CODE = SUB1.CODE and SUB1.ZYOUKEN = '1' (1) left join SUB_TABLE SUB2 on MAIN.CODE = SUB2.CODE and SUB2.ZYOUKEN = '' (2) where MAIN.CODE = 'XXX' ----------------------------------------------------------- 質問1. どうも、(2)の部分を空文字(?)ではなく何か値を入れると正常に1件 取得できるようなのですが、なぜ外部結合しているにもかかわらず 0件になってしまうのかが良く分かりません。 質問2. やはり条件に空文字を使用するのはよろしくないでしょうか? ※補足 念のため、以下のSQLを実行したところ、こちらは問題なく1件取得 できているので、抽出条件は間違っていないです。 -- SQL2 --------------------------------------------------- select MAIN.MAIN_NAME from MAIN_TABLE MAIN where MAIN.CODE = 'XXX' ----------------------------------------------------------- 以上です。宜しくお願いします。
- ベストアンサー
- Oracle
- joinの入れ子について
A(contenthead)をベースにAがBに存在せずかつCに存在しないデータをを作りたいのですが上手く行きません。以下を実行すると SELECT a.contentid, b.contentid, d.contentid From (contenthead as a LEFT JOIN group as b on a.contentid = b.contentid) left join (contenthead as c LEFT JOIN ouser as d on c.contentid = d.contentid) on a.contentid = c.contentid 表示結果は 1、1、NULL 2、NULL、Null 3、NULL、3 4、NUL、4 と出て来ます。従って両方にないのは2だけということになります。 実際のデータもそうなっています。 そこで、 WHERE ((b. contentid) is null) and ((d. contentid) is null)を上記SQLに付加するとなぜか 2、NULL、Null 3、NULL、null 4、NUL、NULL と表示されます。 教えて頂きたいことお分かり戴けますでしょうか宜しく御願い致します。
- ベストアンサー
- MySQL
- LEFT JOIN とRIGHT JOINの合体版のような結合方法。
LEFT JOIN とRIGHT JOINの合体版のような結合方法。 使用DBはMySQL5.0.45です。 2つのテーブルの結合方式で、結合条件に合致しなかった場合、 両方のデータを結果セットに含めることはできますか? LEFT JOINだと、左側のテーブルのデータは結果に返ってきて、右側のデータはNULLになります。 RIGHT JOINだと、右側のテーブルのデータは結果に返ってきて、左側のデータはNULLになります。 これを「左側データあり右側NULL」「左側NULL右側データあり」というレコードを混ぜて結果として返したいです。 具体的には、 以下二つのテーブルがあるとします。 table : test1 value id ------------------- ああ 3 いい 4 うう 5 table : test2 value id -------------------- AAA 1 BBB 2 CCC 3 DDD 4 id を結合条件のキーとして、以下のような結果を得たいです。 NULL NULL AAA 1 NULL NULL BBB 2 ああ 3 CCC 3 いい 4 DDD 4 うう 5 NULL NULL LEFT JOINだと以下の結果に、 SELECT * FROM test1 LEFT JOIN test2 ON test1.id=test2.id ああ 3 CCC 3 いい 4 DDD 4 うう 5 NULL NULL RIGHT JOINだと以下の結果になってしまいます。 SELECT * FROM test1 RIGHT JOIN test2 ON test1.id=test2.id NULL NULL AAA 1 NULL NULL BBB 2 ああ 3 CCC 3 いい 4 DDD 4 以上、ご教示お願い致します。
- ベストアンサー
- MySQL
- LEFT JOINが2つあるSQL文でANDの意味
■下記SQL文の意味を教えてください SELECT a.*, b.being_name FROM alive a LEFT JOIN being b ON a.hoge_id = b.id LEFT JOIN call c ON c.call_id = a.hoge_id AND f.hoge_id = 12 WHERE f.hoge_id = 12 OR b.id = 12 ※12の部分は動的に切り替わります ・LEFT JOINが2つあるので、3つのテーブルを結合しているのでしょうか? ・左テーブルは「alive a」で、この右側に2つのテーブルが結合している、という認識でよいでしょうか? >SELECT フィールド名 FROM テーブル名 WHERE 条件式1 AND 条件式2 >「AND」は2つの条件式の論理積 ・上記内容をネットで見かけたのですが、「AND」は、「WHERE」の前に来てもいいのでしょうか? それともこのSQLの「AND」は違う使い方をしているのでしょうか? 何か、LEFT JOINに関係しているのでしょうか?
- ベストアンサー
- MySQL
質問者からのお礼
storkさん! 回答ありがとうございました。 storkさんから教わったとおりできました! ありがとうございました(^-^)