• ベストアンサー

JOIN 句の書き方について

CHRONOS_0の回答

  • ベストアンサー
  • 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を入れる方法と ユニオンクエリだったのですが、 いろいろ方法があるのですね。 勉強になります。 ありがとうございます。

関連する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