締切済み SQLの結合 2007/10/18 22:16 SQLの結合を行う際にwhereで結合する場合とfromないでleft joinなどで結合を行う場合ではどちらのほうが処理が早いのでしょうか? みんなの回答 (1) 専門家の回答 みんなの回答 yambejp ベストアンサー率51% (3827/7415) 2007/10/19 09:54 回答No.1 ロジックが同じであれば処理速度はかわらないと思います。 EXPLAINで状況を確認すればある程度まで把握できます 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 カテゴリ [技術者向] コンピューターデータベースMySQL 関連するQ&A 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で抽出されなければならないデータが抽出されないので困ります。 よろしくお願いいたします。 テーブル結合について、下記SQLをANSI結合の書き方で表したい。 テーブル結合について、下記SQLをANSI結合の書き方で表したい。 select * from (select key from A union select key from B union select key from C) X, A,B,C where X.key=A.key(+) and X.key=B.key(+) and X.key=C.key(+) このSQLをANSI結合の記述で書きたいのですが、 (+)での結合文になれておらず試行錯誤しております。 下記のようなのかなとは模索しておりますが、 手元に実行環境がなくわかりません。 また、要所気付く点などありましたら、ご指摘願います。 select A.*, B.*, C.* from (select key from A union select key from B union select key from C) X, LEFT JOIN A ON X.key=A.key LEFT JOIN B ON X.key=B.key LEFT JOIN C ON X.key=C.key SQL 外部結合について EXCELでODBC接続で外部データを取り込み、クエリテーブルを作成するところまではできるのですが、MicrosoftQueryを使って外部結合をしようとすると、テーブルが3個以上ある場合は外部結合できませんとエラーが表示されます。 直接SQLをさわれば出来るのかと思い、 SELECT フィールド名1, フィールド名2, ... FROM (((TABLE1 LEFT JOIN TABLE2 ON TABLE1.NO = TABLE2.NO)LEFT JOIN TABLE3 ON TABLE1.NO = TABLE3.NO)LEFT JOIN TABLE4 ON TABLE1.NO = TABLE4.NO)LEFT JOIN TABLE5 ON TABLE1.NO = TABLE5.NO を入力したのですが、「ORA-00942: 表またはビューが存在しません」というエラーが発生しました。 いろいろ調べてみたのですが全くの初心者なもので本当に困っております。 どなたかアドバイス等よろしくお願いします。 ネットワークエンジニアとは?技術職の未来を考える OKWAVE コラム DBを問わないSQLのチューニングが学べる本はありますか? 以下のSQLはほぼ全てのDBで使用できると思いますが どちらが高速なのでしょうか?このような、 DBを問わずにSQL文に関する基礎的なチューニングが学べる本はありますでしょうか? (1)JOINを使わずに結合 select * from A,B,C WHERE A.a=B.a AND A.b =C.b (2)JOINを使用して結合 select * from A left join B on A.a=B.a left join C on A.b=C.b 固定値を含む結合と複数テーブルの結合について 「1.固定値を含む結合」と「2.複数テーブルの結合」について教えて下さい。 最近oracleを使い始めてSQLで表の結合を書く場面があるんですが LEFT(RIGHT) JOIN を使うのか、(+)を使って書くのかで迷っています。 LEFT(RIGHT) JOINだと固定値を含めて外部結合しようとするとエラーになってしまいます。 それが嫌で(+)を使っていたんですが 今度は複数のテーブルを(+)で結合しようとするとエラーになってしまいます。 (AテーブルとBテーブル、AテーブルとCテーブルなど?) こういう場合はどうすれば良いのでしょうか? とりあえず副参照をFROMに指定して対処してるんですが 何かきちんとした書き方があるのでしょうか?誰か教えて下さい。 テーブルの結合について 以下の二つを実行すると、2 の方がかなり速いのですが理由が分かりません。 分かる方教えてもらっていいですか? DBはMYSQLでInoDBです。 ちなみに Aは1万件、B は10万件ほど 1 のSQL SELECT * FROM A LEFT JOIN (SELECT * FROM B WHERE ・・・ GROUP BY XXX) B ON A.id = B.XXX WHERE ・・・ GROUP BY A.id 2 のSQL (SELECT * FROM A ・・・ GROUP BY ID ) A LEFT JOIN (SELECT * FROM B WHERE ・・・ GROUP BY XXX) ON A.ID = B.XXX.ID WHERE句はJOIN結合前結合後どちらに効くのか 以下の2つのSQLを比較してどちらがパフォーマンスが良いでしょうか。 先に抽出して結合した方が良いと昔聞いた事がありましたが 記憶があいまいになってしまいました。 (1) SELECT * FROM A JOIN B ON A.*** = B.*** WHERE A.*** = '0001' (2) SELECT * FROM (SELECT * FROM A WHERE A.*** = '0001') AS A JOIN B ON A.*** = B.*** 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の内部結合について 現在mySQLを使って、SQL文の勉強をしているのですがわからないことがあり、質問させていただきました。 テーブル同士をINNER JOINして結果を取得して、これに対してさらに別の処理(Whereなど)を行いたいのですが、うまくやり方がわかりません。 具体的にSQL文でいうとこんな感じです(ただしエラーが出て動きません)。 SELECT cmaster.comic_id,tags,title FROM mysql.comic_tag as ctag INNER JOIN mysql.comicmaster as cmaster ON ctag.comic_id = cmaster.comic_id AND WHERE tags = 'aa' この処理でやりたいことを説明するとcomic_tagとcomicmasterを結合して、その結果に対してさらにWhereでデータを絞るということしています。 このような場合はどのように処理をしたらいいんでしょうか?またjoinした後のデータを、既存のテーブルのように扱いたいのですが、なにか方法はないのでしょうか? SQLの外部結合について教えて下さい いつもお世話になっています。 SQL構文の外部結合が分らなくて困っています。 どうか教えて下さい。 JSPからString Nam = (request.getParameter("param"));で値を受け取ってその値でT_Tableと一致するデータのSQLを実行します。 SELECT * FROM T_Table where ID='"+ Nam +"' order by 日付 desc この結果とT_TableAの「番号」というフィールドと一致する問い合わせのSQLが分りません。自分なりに考えて作りましたがHTMLの部分の表示だけでレコードが表示されないので間違っているのだと思います。 色々調べてみましたが該当のサンプルがなかったので困っています。 教えて下さい!宜しくお願い致します。 【自分で作成してみたSQLです】 テーブルはSQL Serverです。 "SELECT * FROM T_Table where ID='"+ Nam +"' INNER JOIN where ID='"+ Nam +"' ON [T_Table].[番号] = [T_TableA].[番号] order by 日付 desc" SQL 主キーによる自動的な表の結合 複数の表を主キーで結合する際、そのままWHERE句に条件を列挙するのが普通ですが、 主キーの数が多いので、これを簡単に記述方法はないでしょうか? できれば Natural Join のようにテーブル名のみを記述し、 DBMS(Oracle)が主キーのみを自動的に結合してくれればベストです。 Natural Join を使用できない理由の1つは、複数の表に登録日という列があり、 Natural Joinすると主キーでない登録日まで結合してしまうからです。 SQLは次のようになっています SELECT * FROM TBL_A NATURAL JOIN TBL_B NATURAL JOIN TBL_C ... ※join using, join on 句は使用できないようです。 ※登録日の列名は変更できません。 Oracle Database 9.2.0.4 結合SQLに関して 結合SQLに関して ある3つのテーブルが存在し、TABLE1の情報を核として、TABLE2,TABLE3と 結合させて情報を取得しようと考えています。 TABLE1とTABLE2だけであれば LEFT OUTER JOIN等を駆使すれば、TABLE1を核として 全件表示可能かと思いますが、TABLE3も含めて結果のような形にしたい場合は、 どのようにSQLを記述すれば良いでしょうか。。。。 初歩的な質問で申し訳ありませんが、教えて下さい。 TABLE1 NO 1 2 3 TABLE2 NO,BUSYO_CODE 1,123 2,123 3,456 TABLE3 BUSYO_CODE,BUSYO_NAME 123,総務 456,経理 結果 NO,BUSYO_CODE,BUSYO_NAME 1,123,総務 2,123,総務 3,456,経理 よろしくお願いします。 AIは使う人の年齢や市場にも影響する?人工知能の可能性 OKWAVE コラム 外部結合に条件をつけたい oracle初心者です。 表A:ID、氏名 表B:ID、入社年、給与 上の表A,Bを、表Aを左辺にしてLEFT JOINする場合に、単純な外部結合では無く、 入社年が2000年以降の表Bのみ結合したい時のSQL文ですが、 select * from 表A LEFT JOIN 表B ON 表A.ID=表B.ID where 表B.入社年 > 2000 または、 select * from 表A,表B where 表A.ID=表B.ID(+) and 表B.入社年 > 2000 のように記述して実行すると、内部結合になってしまいます。 これを(外部結合として)実現するには、どのように記述すればよいでしょうか? 宜しくお願いいたします。 3テーブル外部結合方法について 3つのテーブルを外部結合したいのですが・・・、 こんがらがってしまいました。 A,B,Cの3テーブルがあり、A,B,Cの順に外部結合 (LEFT OUTER JOIN)したいのですが、 A,BのテーブルについてはWhere句の条件指定が 必要です。 Select From (Select AA.a From A AA Where b = xxxx) BB Left Outer Join (Select CC.b From B CC Where c = eeee and BB.a = CC.b) On ???? こんな感じでつまづいてしまいました・・・ SQL文の変換(Oracle→MySQL)結合句 OracleからMySQLへSQL文を変換するにあたり、 テーブル結合部分が複数ありややこしくて以下で合っているのか、分かる方いましたらご教授ください。 ■Oracle SELECT * FROM m, h, p, c WHERE m.mid = h.mid(+) AND m.tcd = '0' And h.pid = p.pid(+) And m.rcd = c.rcd And c.cid = 'aaa' ■MySQL SELECT * FROM m left outer join h on m.mid = h.mid and m.tcd = '0' h left outer join p on h.pid = p.pid m left inner join c on m.rcd = c.rcd and c.cid = 'aaa' 表結合の処理速度(負荷) ご覧頂きありがとうございます。 今回の質問ですが、MySQLの表結合時の処理速度(負荷)についてお聞きします。 SELECT abcd.name, hoge.age FROM abdc, hoge WHERE abcd.id = hoge.id; SELECT abcd.name, hoge.age FROM abcd LEFT JOIN hoge ON abcd.id = hoge.id; 上記のいわゆるJOINとJOIN(省略)?になりますが、どちらが処理速度的に優秀なのでしょうか? 可能であればどういった処理が走っているのかも御存じであれば教えて頂きたいです。 参考URLでも構いませんので、よろしくお願い致します。 複数の外部結合 こんにちは、外部結合の仕方についてお聞きしたいのですが、 このSQL1で抽出されたデータにさらに TABLE3テーブルのデータを追加したくSQL2を作成したのですが、 うまくいきません。 ON TABLE1.[Code]=TABLE3.[Code]の部分をどのように記述すればよいのでしょうか? SQL1--------- TABLE1.[tamp] [Child], TABLE2.* FROM [p].[Price] TABLE1 LEFT OUTER JOIN [p].[Receive] TABLE2 ON TABLE2.[Code]=TABLE1.[Code] SQL2---------- TABLE1.[tamp] [Child], TABLE2.*, TABLE3.* FROM [p].[Price] TABLE1 LEFT OUTER JOIN [p].[Receive] TABLE2 ON TABLE2.[Code]=TABLE1.[Code] LEFT OUTER JOIN [p].[Product] TABLE3 ON TABLE1.[Code]=TABLE3.[Code] 外部結合について left joinとright joinが交じり合った構文で途方に暮れています・・。 以下の(+)を使わずに、left joinとright joinを使うにはどのように書けばいいのでしょうか? ・・・・・・ FROM A,B,C WHERE A.CD=B.CD(+) AND B.NAME(+)=MAX(A.NAME) すみませんがよろしくお願いします。 【至急】SQLの結合について教えてください。 select * from A where ab = '1' and cd = '2' select ef from B where ab = '1' and cd = '2' and ef = '3' 至急質問させてください。 上記SQLを結合したいです。(Oracleです) 取得したいデータはAのテーブルの全項目で、 取得条件として、Bのテーブルの項目ef = '3' だったらという条件を加えたいです。 キー項目は両テーブルとも同じ(ab, cd)です。 どのようなSQLがスマートでしょうか。。 無知で申し訳ございませんが、ご教授いただけますと幸いです。 よろしくお願いいたします。 SQL 外部結合 Access2003でSQLをかいています。 以下のように書いているのですが、 「結合式がサポートされていません」というエラーが発生します。 対応策をご存知の方、お教えいただけますでしょうか。 使用するテーブルは以下の3つです。 ・社員テーブル ・所属テーブル ・判定テーブル それぞれのテーブルの項目は以下のとおりです。 ▼ 社員テーブル ------------------- 個人No 入社年度 ▼ 所属テーブル ------------------- 個人No 所属コード ▼ 判定テーブル ------------------- 所属コード 入社年度 判定フラグ 下記のようなSQLを書いています。 --------------------------------------------------------------------- SELECT A.個人No, C.判定フラグ FROM (社員マスタ A LEFT JOIN 所属テーブル B ON (A.個人No = B.個人No)) LEFT JOIN 判定テーブル C ON (B.所属コード = C.所属コード AND A.入社年度 = C.入社年度) --------------------------------------------------------------------- 最終行の「AND A.入社年度 = C.入社年度」がなければ、SQLは実行できますが 入社年度で条件を絞れないので正しい結果になりません。 LEFT JOIN 句は3テーブル目の条件式で1テーブル目を参照できないということでしょうか? 注目のQ&A 私はとてつもなく運が悪いです。 外付けHDD「このフォルダーは空です」 中3 夢に向かって努力をしたい 自分を変えたい 出会い系で知り合った人妻について 一方的に親友に縁を切られました LIFEBOOK A577/P A746 飲み薬 タイヤ比較検討 パソコンのスペック 突然、知らない親族の未払金支払い通知が届きました カテゴリ [技術者向] コンピューター データベース SQL ServerOraclePostgreSQLMySQLNoSQLその他(データベース) カテゴリ一覧を見る OKWAVE コラム マッチングアプリは顔写真が重要!容姿に自信がなくても出会いを見つけるには 美容男子ミドル世代の悩み解決?休日ファッション・爪・目元ケア プラモデル塗装のコツとは?初心者向けガイド 突然のトラブル?プリンター・メール・LINE編 携帯料金を賢く見直す!格安SIMと端末選びのポイントは? あなたにピッタリな商品が見つかる! OKWAVE セレクト コスメ化粧品 化粧水・クレンジングなど 健康食品・サプリ コンブチャなど バス用品 入浴剤・アミノ酸シャンプーなど スマホアプリ マッチングアプリなど ヘアケア 白髪染めヘアカラーなど インターネット回線 プロバイダ、光回線など