• ベストアンサー

JOIN 句の書き方について

毎度お世話になっております。 以下のテーブルの内容があります。 ・テーブル1 フィールド1     a ・テーブル2 フィールド1   親   子   孫     1     a     なし   なし     2    なし    a   なし     3    なし   なし    a     4    なし   なし   なし ここで、テーブル1.フィールド1の内容を含む テーブル2の行を抽出したいのです。 ・希望する結果 フィールド1   親   子   孫    1   a   なし   なし    2   なし   a   なし    3   なし   なし   a 以下のSQL文を作成したところ希望する結果になりましたが、 ONの中にORを書いてもよいのでしょうか。 それともUNIONクエリにすべきなのでしょうか。 SELECT テーブル2.フィールド1, テーブル2.親, テーブル2.子, テーブル2.孫 FROM テーブル1 LEFT JOIN テーブル2 ON (テーブル1.フィールド1 = テーブル2.孫) OR (テーブル1.フィールド1 = テーブル2.子) OR (テーブル1.フィールド1 = テーブル2.親); よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.1

>ONの中にORを書いてもよいのでしょうか。 別にかまいませんけれど テーブル2の親、子、孫が同じテーブル1を参照しているのなら SELECT テーブル2.フィールド1, テーブル2.親, テーブル2.子, テーブル2.孫 FROM テーブル2 WHERE テーブル2.親 In (select フィールド1 from テーブル1) OR テーブル2.子 In (select フィールド1 from テーブル1) OR テーブル2.孫 In (select フィールド1 from テーブル1); のほうが素直かな

tokonoko
質問者

お礼

回答ありがとうございます。 頭をひねってひねって考えたのがORを入れる方法と ユニオンクエリだったのですが、 いろいろ方法があるのですね。 勉強になります。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

データ抽出の条件としてJOINを使うときに留意すべきなのは、データの重複です。 今回の例でOR付のJOINとUNIONとで同じ結果になるのは、テーブル1のフィールド1がユニークであることが大前提ですが、コーディング上ORを使ったJOINはそのことに気づきにくいのが難点です。 なので、今回の例であれば、No1さんのようにするか、 SELECT テーブル2.フィールド1, テーブル2.親, テーブル2.子, テーブル2.孫 FROM テーブル2 WHERE EXISTS (SELECT NULL FROM テーブル1 WHERE テーブル1.フィールド1 IN (テーブル2.親,テーブル2.子,テーブル2.孫)) とするか、いずれにしてもJOINしない方がいいと思います。

tokonoko
質問者

お礼

回答ありがとうございます。 頭をひねってひねって考えたのがORを入れる方法と ユニオンクエリだったのですが、 いろいろ方法があるのですね。 今回のテーブル1.フィールド1は主キーでありましたが しかしORは使わないようにしようと思います。 勉強になります。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • JOINの方法について

    毎度お世話になっております。 以下のテーブル1、テーブル2があります。 [テーブル1] CODE   1月  2月  A      10  10  C      30  30 [テーブル2] CODE   3月  4月  A      10  10  B      20  20  D      40  40 これを以下のようにくっつけたいのです。 [希望する結果] CODE   1月  2月  3月  4月  A      10  10  10  10  B             20  20  C      30  30  D             40  40 クエリ1(テーブル1 LEFT JOIN テーブル2とする)と、 クエリ2(テーブル2 LEFT JOIN テーブル1とする)を作り、 UNIONでくっつける方法を考え、希望した結果は得られましたが、 もっとスマートな方法(一つのクエリでできるような方法)が あればご教授ください。

  • どちらの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
  • joinの場合のテーブル名の別名の使用方法

    select * from table1 a,table2 b where a.field1=b.field1; とできますが select * from table1 as a left join table2 as b on a.field1=b.field1; とできません。 joinの場合にテーブル名の別名を使う方法を教えてください

  • JOIN句への変換

    はじめまして。 「*=」をJoin句に直したいのですが、同様の結果がえられません(T.T) SQL初心者です、どうぞよろしくお願いいたします。 この式をJOIN句に直したいです。 FROM A_TBL, B_TBL as B_TBL01, B_TBL as B_TBL02, C_TBL, D_TBL WHERE A_TBL.No = B_TBL01.No AND A_TBL.No = B_TBL02.No AND A_TBL.No = C_TBL.No AND A_TBL.No *= D_TBL.No AND C_TBL.ID *= D_TBL.ID AND ↓こうしたのですが、正しい結果がえられません。 FROM (D_TBL RIGHT OUTER JOIN C_TBL ON C_TBL.ID = D_TBL.ID) RIGHT OUTER JOIN A_TBL INNER JOIN B_TBL AS B_TBL01 ON A_TBL.No = B_TBL01.No1.No INNER JOIN B_TBL AS B_TBL02 ON A_TBL.No = B_TBL02.No2.No ON A_TBL.No = D_TBL.No AND A_TBL.No = C_TBL.No どうぞ、ご教授お願いいたします。

  • ~JOIN ON句でこのような問い合わせはできるのでしょうか?

    SELECT * FROM `テーブル1` AS t1 LEFT JOIN `テーブル2` AS t2 ON ( ( t1.a * 100000 ) + t1.b ) = t2.a エラーはでませんが、意図したレコードが返ってきません。クエリの使い方が間違っているのでしょうか?教えてください。 検証環境:MySQL 4.0.24-standard

    • ベストアンサー
    • MySQL
  • ちょっと見かけないinner joinについて

    どなたか以下の構文について教えて下さい。 どこのDBMSで使用されるものなのでしょう? SELECT B.項目1, B.項目2, A.項目2, A.項目3 FROM ( ( SELECT * FROM Bテーブル WHERE 項目3>"1" ) B INNER JOIN ( SELECT * FROM Aテーブル WHERE 項目2=10 ) A ON B.項目1=A.項目1; 意味はわかるのですが、普通のinner joinとは違うもので。

  • ACCESS での LEFT JOIN 時の WHERE 句の使用について

    以下のテーブル1、テーブル2で、 テーブル2のDATE2が、テーブル1のDATE以前になっている VOL2を集計したいと考えています。 テーブル1 CODE   DATE     VOL --------------------------- a     20080601  100 a     20080602  100 a     20080603  100 テーブル2 CODE   DATE2    VOL2 ------------------------ a     20080602   50 a     20080603   50 希望する結果のイメージ CODE   DATE     VOL    VOL2 --------------------------------------- a    20080601   100     0 a    20080602   100     50 a    20080603   100    100 以下のSQLを考えましたが、DATE以前のDATE2を持たない場合、 テーブル1の行が表示されませんでした。 SQL文 SELECT t1.CODE, t1.DATE, t1.VOL , Sum(t2.VOL2) AS VOL2の合計 FROM テーブル1 as t LEFT JOIN テーブル2 as t2 ON t1.CODE = t2.CODE WHERE t1.DATE >= t2.DATE2 GROUP BY t1.CODE, t1.DATE, t1.VOL 結果 CODE   CDATE   VOL   VOL2の合計 -------------------------------------- a    20080602  100    50 a    20080603  100   100 SQL文中にある WHERE t1.DATE >= t2.DATE2 が原因しているのではと考えています。 しかし、どのようにしたらよいのかがわかりません。 どなたか、ご教授をお願いします。

  • 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
  • Doctrineのjoinについて

    symfony+Doctrineで開発をしています。 他のプログラムは経験があるもののPHP初心者です。 2つのテーブルをjoinして、両テーブルの結果を取得します。 where句の条件どおりに行数を得られているので、 joinはできていると思います。 でも、結果を取得することが出来ません・・。 具体的には、joinしたテーブル(BTable)のカラムを取得しようとすると、 「Unknown record property / related component "value" on "ATable"」というエラーが出てしまいます。 (ATableにはvalueなんてないよ、って言っているみたいですが) ●ソースはこんな感じ $query = Doctrine_Query::create() ->select('a.name, b.value') ->from('ATable a') ->innerJoin('a.Btable b') ->where('b.id = ?', $id); $list=$query->execute(); foreach($list as $xxx){ print_r($xxx['name']); print_r($xxx['value']);←ここでエラー } ●エラーメッセージ Unknown record property / related component "value" on "ATable" そこで質問させてください。 ・xxx['value']の箇所は、どのように記述すればいいのでしょうか? ・もしくは、Doctrineではjoinしたテーブルの値は取得できないのでしょうか?  (webでいろいろ調べましたが、joinの例はあるものの、select結果を使う、といった例が見つかりませんでした・・) 方法がないのであれば、 あらかじめテーブルをjoinしたviewを作って、 それをselectするようにしようと思っています。 symfony+Doctrineに詳しい方がいらっしゃたら、 よろしくおねがいします。

    • ベストアンサー
    • PHP
  • 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