• ベストアンサー

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テーブル目を参照できないということでしょうか?

  • peca
  • お礼率92% (24/26)

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

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.1

> 条件式で1テーブル目を参照できないということでしょうか? については分かりません。 以下のように変形して、C と結ぶのを 1つにしてみるのはどうでしょうか。 (未検証) SELECT TA.個人No, C.判定フラグ FROM (SELECT A.*, B.所属コード FROM 社員マスタ AS A  LEFT JOIN 所属テーブル AS B       ON (A.個人No = B.個人No)) AS TA  LEFT JOIN 判定テーブル AS C       ON (TA.所属コード = C.所属コード AND TA.入社年度 = C.入社年度)

peca
質問者

お礼

教えていただいた方法で解決しました! 結合したテーブルを新しい名前で定義して、さらに結合するという感じ…ですよね。 ありがとうございました!!

その他の回答 (1)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.2

SELECT D.個人No, C.判定フラグ FROM [select a.個人No, a.入社年度, b.所属コード from 社員マスタ A LEFT JOIN 所属テーブル B ON (A.個人No = B.個人No)]. as D LEFT JOIN 判定テーブル C ON (D.所属コード = C.所属コード AND D.入社年度 = C.入社年度) ではだめですか?

peca
質問者

お礼

ご回答いただき、ありがとうございます。 教えていただいた方法でもできました! []で囲っている形ははじめて見たので勉強になりました。

関連するQ&A

  • 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: 表またはビューが存在しません」というエラーが発生しました。 いろいろ調べてみたのですが全くの初心者なもので本当に困っております。 どなたかアドバイス等よろしくお願いします。

  • SQLでの条件分岐

    現在SQLの勉強をしているのですが、条件分岐の方法がわかりません。 全社員を登録したテーブルAと一部社員のみが登録されたテーブルBがあり、両テーブルを外部結合し、Bに登録されているかどうかでフラグを設定しています。 select A.*, B.*, NVL2(A.EMP_NO,'1','0') flag from A left outer join B on A.EMP_NO = B.EMP_NO and A.EMP_NAME = B.EMP_NAME ・上記SQLで設定したフラグの値をもとに、(1)Aのみに登録された社員、(2)Bのみに登録された社員、(3)両テーブルに登録された社員を出すためにはどのようにすれば宜しいでしょうか。 (2)、(3)に関しては、上記パターンならテーブルそのものを出せば済む話なのですが、今後のためにフラグから判定する方法でご教授お願いいたします。

  • 結合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,経理 よろしくお願いします。

  • 複数の外部結合

    こんにちは、外部結合の仕方についてお聞きしたいのですが、 この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]

  • 外部結合について

    SQL文で、 select・・・・(select・・・・・) a ・・ となっていて、このaを使ってjoinをしたいと思っているのですが、 select・・・・(select・・・・・) a From (a right join NAME b on a.CD=b.CD) right join c・・・・・・ としてしまうとエラーとなってしまいます。 このaの使い方がわかりません。テーブル名という訳ではないので・・。 どなたかアドバイスお願いします。

  • Oracle[10g]のSQL文について。(新No.3)

    なんども、恐縮です。 Oracle[10g]のSQL文についての質問です。(新No.3) 実は、JOINが多くてどこに[ROW_NUMBER]を入れれば良いのか解りません。 [A]テーブルに [CODE](KEY) [CODE2] のフィールドがあります。 A-1 B-1 A-2 B-2 A-3 B-3 [A2]テーブルに [CODEB](KEY) [CODE2] のフィールドがあります。 AA-1 B-1 AA-2 B-2 AA-3 B-3 [B]テーブルに [CODE3](KEY) [NAME-B] のフィールドがあります。 B-1 NAME-B-1 B-2 NAME-B-2 [C1]テーブルに [NO](KEY) [LINE](KEY) [CODE] [CODEB]のフィールドがあります。 X 1 A-1 AA-2 X 2 A-3 AA-1 Y 1 A-2 AA-3 [C2]テーブルに [NO](KEY) [LINE](KEY) [LINE2](KEY) [BIKO] のフィールドがあります。 X 1 1 BIKO-1 X 1 2 BIKO-2 結果が [NO/LINE/CODE/CODEB/NM1/NM2/BIKO] X 1 A-1 AA-2 NAME-B-1 NAME-B-2 BIKO-1 X 2 A-3 AA-1 (null) NAME-B-1 (null) と、なる様にしたいのです。 要するに、のBIKOは、[C2.LINE2]の一番最小の物を取得したいのです。 SELECT C1.NO, C1.LINE, C1.CODE, C1.CODEB, B.NAMEB AS NM1, B_1.NAMEB AS NM2, C2.LINE2, C2.BIKO FROM ((((C1 LEFT JOIN A ON C1.CODE = A.CODE) LEFT JOIN B ON A.CODE2 = B.CODE3) LEFT JOIN A2 ON C1.CODEB = A2.CODEB) LEFT JOIN B B_1 ON A2.CODE2 = B_1.CODE3) LEFT JOIN C2 ON (C1.LINE = C2.LINE) AND (C1.NO = C2.NO) WHERE (((C1.NO)='X')) ORDER BY C1.NO, C1.LINE, C2.LINE2; と、考えたのですが、結果が X 1 A-1 AA-2 NAME-B-1 NAME-B-2 1 BIKO-1 X 1 A-1 AA-2 NAME-B-1 NAME-B-2 2 BIKO-2 X 2 A-3 AA-1 (null) NAME-B-1(null)(null) と、出てしまいます。 どうすれば良いのでしょうか ? 宜しくお願い致します。

  • 外部結合について

    left joinとright joinが交じり合った構文で途方に暮れています・・。 以下の(+)を使わずに、left joinとright joinを使うにはどのように書けばいいのでしょうか? ・・・・・・ FROM A,B,C WHERE A.CD=B.CD(+) AND B.NAME(+)=MAX(A.NAME) すみませんがよろしくお願いします。

  • SQLのテーブル結合

    SQLのSELECTについて質問です。 テーブルA、B、Cから情報を取得し、下記の画面イメージを表示させたいのですが、 どのようにテーブルを結合すればよいか判りません。 どなたかご教示ください・・・。よろしくお願いします。 #テーブルCから組名を取得するような処理は画面表示のロジックで行います。 #テーブルA、Bの結合についてのみ、教えていただきたいです。 条件 ・氏名と、所属情報の○×を表示したい ・DISTINCT等、重たい処理は避けたい 画面イメージ |氏名  |赤組|白組|青組| ------------------------------ |山田太郎|○ |× |× | |山田花子|× |○ |○ | テーブルA |個人ID|氏名  | -------------------- |000001|山田太郎| |000002|山田花子| テーブルB |個人ID|組コード| -------------------- |000001|1110  | |000002|1111  | |000002|1112  | テーブルC |組コード|組名| ------------------ |1110  |赤組| |1111  |白組| |1112  |青組|

  • PostgreSQLでの外部結合

    PostgreSQLでの開発をしております。 今まで、Oracle,SQLServerでしか開発経験がなく、外部結合のやりかたがピンときません。 Oracleでいう以下のSQLをPostgreで書く場合、どのように記載すればよいのでしょうか? SELECT m.no, c.value FROM main_table m, code_master c WHERE m.code = c.code(+) AND m.update_date > sysdate AND c.content_flg = "0"; main_tableのcodeがNullや、code_master.codeに対応する値がない場合でも、レコードを持ってくる。 ※Oracleなどは独自のやりかたを行っているので、Joinを使うやりかたのほうがSQLとしては正しいのですが・・・。

  • 固定値を含む結合と複数テーブルの結合について

    「1.固定値を含む結合」と「2.複数テーブルの結合」について教えて下さい。 最近oracleを使い始めてSQLで表の結合を書く場面があるんですが LEFT(RIGHT) JOIN を使うのか、(+)を使って書くのかで迷っています。 LEFT(RIGHT) JOINだと固定値を含めて外部結合しようとするとエラーになってしまいます。 それが嫌で(+)を使っていたんですが 今度は複数のテーブルを(+)で結合しようとするとエラーになってしまいます。 (AテーブルとBテーブル、AテーブルとCテーブルなど?) こういう場合はどうすれば良いのでしょうか? とりあえず副参照をFROMに指定して対処してるんですが 何かきちんとした書き方があるのでしょうか?誰か教えて下さい。