SQL文について-社員マスタ、得意先マスタ、地域マスタの結合方法と地域コードの参照方法

このQ&Aのポイント
  • SQL文で社員マスタ(TBL_SHAIN)、得意先マスタ(TBL_TOKUI)、地域マスタ(TBL_AREA)を結合する方法と地域コードの参照方法についてアドバイスをいただきたいです。
  • 社員マスタの地域コードと地域マスタの地域コードを結合するには、「JOIN」キーワードを使用し、共通の地域コードを指定します。得意先マスタの地域コードを参照するには、「IN」キーワードを使用し、社員マスタの地域コードをサブクエリ内で取得します。
  • 具体的には、以下のSQL文を使用して社員マスタと得意先マスタを結合し、社員マスタの地域コードに該当する得意先を参照することができます。 SELECT * FROM TBL_SHAIN JOIN TBL_TOKUI ON TBL_SHAIN.area_code = TBL_TOKUI.area_code WHERE TBL_SHAIN.area_code IN (SELECT chr(39) || array_to_string(area_code, ''',''') || chr(39) FROM TBL_SHAIN);
回答を見る
  • ベストアンサー

SQL文について

下記の3つのテーブルがあります。 ・社員マスタ(TBL_SHAIN) ・得意先マスタ(TBL_TOKUI) ・地域マスタ(TBL_AREA) 各テーブルのフィールドは下記の通りです。 ・社員マスタ(TBL_SHAIN)  ・社員コード(shain_code)  ・社員名(shain_name)  ・役職タイプ(post_type)  ・地域コード(area_code) ・得意先マスタ(TBL_TOKUI)  ・得意先コード(tokui_code)  ・得意先名(tokui_name)  ・地域コード(area_code) ・地域マスタ(TBL_AREA)  ・地域コード(area_code)  ・地域(area_name)  ・分類コード(kind_type) ※社員マスタ(TBL_SHAIN)の地域コード(area_code)は配列型です。 社員マスタの地域コードには下記のような配列データが格納されています。 ・「{E01,E02,S01,T01,C03}」  ※この値は地域マスタ(TBL_AREA)の地域コード(area_code)です。 試しに 下記のSQLで配列データを下記のような形式に変換。  SELECT chr(39) || array_to_string(area_code, ''',''') || chr(39) FROM TBL_SHAIN;   「'E01','E02','S01','T01','C03'」 上記で出力した値('E01','E02','S01','T01','C03')で得意先マスタを検索できるかと思って下記のSQLを実行。 SELECT * FROM TBL_TOKUI WHERE area_code IN (SELECT chr(39) || array_to_string(area_code, ''',''') || chr(39) FROM TBL_SHAIN); 結果は空でした。 やりたい事は社員マスタ(TBL_SHAIN)の地域コード(area_code)と地域マスタ(TBL_AREA)の地域コード(area_code)を結合し、また得意先マスタ(TBL_TOKUI)の地域コード(area_code)と結合しようと考えています。 みなさんにアドバイスいただきたいのは社員マスタと得意先マスタと地域マスタを結合するにはどのようにしたらいいでしょうか。 また社員マスタの地域コードに該当する得意先を参照するにはどうしたらいいでしょうか。 どうか宜しくお願いします。

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

  • ベストアンサー
回答No.1

結果空のSQLは SELECT * FROM TBL_TOKUI T WHERE EXISTS(SELECT ' ' FROM TBL_SHAIN S WHERE T.area_code=ANY(S.area_code)) で可能です。

T-k_jp
質問者

お礼

お礼が遅くなってすみません。 アドバイスを参考にしてSQL文を作成して実行したところ、私が望む結果を得る事ができました。 ありがとうございました。 では、失礼します。

関連するQ&A

  • SQL文を教えて下さい

    VB2008、SQL Server で開発をしています。 下記の条件でデータを取得したいのですが、SQL文がうまくできず、困っています。 おわかりの方、教えてください。 仕様:得意先マスタ(得意先M)の全件と、売上テーブル(売上T)を読みます。     売上テーブルの商品コードの商品名を商品マスタ(商品M)より取得します。     得意先マスタの全得意先を取得する必要があります。     すべての得意先の売上データが存在するわけではありません。 ACCESS上でクエリを作成し、SQLビューにすると、こうなります。 inptSyoCD:画面から入力した商品コード 1,まず、クエリ1: SELECT 売上T.伝票日付, 売上T.伝票番号, 売上T.得意先コード, 売上T.明細区分, 売上T.商品コード, 商品M.商品名称 FROM 売上T LEFT JOIN 商品M 売上T.商品コード = 商品M.商品名 WHERE 売上T.明細区分=1 AND 売上T.商品コード= inptSyoCD ; 2,次に、実際に処理するSQL文: SELECT 得意先M.得意先コード, 得意先M.得意先名称,       クエリ1.伝票日付, クエリ1.伝票番号, クエリ1.明細区分, クエリ1.商品コード, クエリ1.商品名  FROM 得意先M LEFT JOIN クエリ1 ON 得意先M.得意先コード = クエリ1.得意先コード ORDER BY 得意先M.得意先コード,売上T.伝票日付,売上T.商品コード; この2つをひとつのSQL文にする方法がわかりません。 よろしくお願いいたします。

  • 条件に応じたSQL文について

    お世話になっております。 以下の場合どのようにSQLを書くかで困っています。 どうかお願いします。 DBはOracle10gです。 テーブルA 区分   integer コード   integer(上記区分が0の場合は得意先のコード、1の場合は商品のコードが登録されています。) 得意先マスタ コード integer 名称 varchar 商品マスタ コード integer 名称 varchar 上記のテーブルAを読んで、 区分が0の場合は得意先マスタの名称 区分が1の場合は商品マスタの名称 をもってきたいのですがやり方がわかりません。 どうかよろしくお願いします。

  • SQL文で質問があります。

    商品マスタがあり、データは下記の感じで登録されています。  コード | 商品名  | 商品カナ | 分類コード ・・・ ---------------------------------------------------------  0001  | マウス  | マウス  | 01     ・・・  0002  | キーボード| キーボード| 01     ・・・  0003  | モニター | モニター | 01     ・・・          ・          ・          ・ SQL文で質問があります。 下記のSQLでは取得できるんですが・・・ SELECT * FROM M_SHOHIN WHERE code = ANY('{0001,0002,0003}'); 下記のSQLを実行したらエラーが出力されました。 SELECT * FROM M_SHOHIN WHERE code = ANY(  SELECT ARRAY_AGG(code) AS code FROM M_SHOHIN WHERE class_code = '01' ); ERROR: operator does not exist: character varying = character varying[] HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. なので下記のようにCASTをするようにして実行したらエラーは出力されなくなりましたがデータの取得ができませんでした。 SELECT * FROM M_SHOHIN WHERE code = ANY(  SELECT CAST(ARRAY_AGG(code) AS VARCHAR) AS code  FROM M_SHOHIN WHERE class_code = '01' ); どのようにすれば取得できますでしょうか。 説明が下手で申し訳ありませんがアドバイスいただけませんでしょうか。 データベースはPostgreSQL 8.4.9です。 宜しくお願いします。

  • 異なるデータベース間のテーブル結合

    DB名:db1 TABLE名:得意先マスタ DB名:db2 TABLE名:ユーザマスタ 以上のように、異なるデータベースに存在する2つのテーブルをLEFT JOINさせたいです。 結合条件は ユーザマスタ.得意先コード = 得意先マスタ.得意先コード とします。 この場合の結合方法を教えてください。 以下のようなSQL文を書いても駄目でした。 SELECT * FROM db1.ADMINISTRATOR.得意先マスタ AS  得意先マスタ   LEFT OUTER JOIN db2.ADMINISTRATOR.ユーザマスタ AS ユーザマスタ ON ユーザマスタ.得意先コード = 得意先マスタ.得意先コード よろしくお願いいたします。

  • SQL文 グループ集計TOPに対する明細

    すみません、教えてください。 得意先の売上額上位10社のそれぞれについて、仕入合計額上位10商品のリストを出力するSQL 文をがわからなくて困っています。 できれば、一般的なSQL文(SQL92)でお願いします。 テーブルは、下記の2つです。 -------------------------------------------- ・t_売上明細  売上日  得意先コード  商品コード  売上金額 ・t_商品マスタ  商品コード  仕入単価 <出力>====================================== 得意先コード, 売上合計,商品コード,仕入額合計 -------------------------------------------- C3 \300100    A08 \32500     A04 \31000     ~~~    A10 \30000(Top10) C2 \200200    A05 \22500    A04 \21000     ~~~     A10 \20000(Top10) ~~~ ~~~ C10 \1000(Top10)    A97 \500    A14 \100    ~~~    A96 \10(Top10) ================================

  • 【MYSQL】フィールド名の変更(半角→全角)について

    フィールド名の変更(半角→全角)について ただいまmysqlを勉強中の初心者なのですが、 入門書を見ながら試験的に作ったテーブルのフィールド名を変更しようとしています。 テーブル名 tbl_employee 元フィールド名 「code」 型 varchar(40) 新フィールド名 「社員コード」 型 varchar(40) ALTER TABLE tbl_employee CHANGE code '社員コード' VARCHAR(40); とか ALTER TABLE tbl_employee CHANGE code 社員コード VARCHAR(40); とか ALTER TABLE tbl_employee CHANGE code '社員コード'; とか ALTER TABLE tbl_employee CHANGE code 社員コード; とか 一通り試してみたのですが動かず… ちなみに「社員コード」ではなく半角で「syain_code」という名前に変更することは出来ました。 全角文字だけがシンタックスエラーになります。 何が原因か分かる方いらっしゃいましたら教えてくださいませ。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQLについて

    SQL初心者です。ご質問させていただきます。 得意先マスタ(得意先CD、得意先分類CD、得意先名)←T [得意先分類CDは重複] 得意先分類マスタ(得意先分類CD、得意先分類名)←B 売上履歴(得意先CD、売上金額)←U というようなマスタが存在した場合に得意先分類CDで集計して、 (得意先分類CD、得意先分類名、売上金額)というようなデータを抽出したくて、下記のようなSQLを作成したのですが、うまくいきません。 SELECT U.得意先分類CD,B.得意先分類名,U.売上金額 FROM T,B,U WHERE T.得意先CD = U.得意先CD AND T.得意先分類CD = B.得意先分類CD GROUP BY B.得意先分類CD  よろしくお願いいたします。

  • UPDATE文

    また、投稿させていただきます。 言語 VB6.0 DB ORACLE9i 接続 oo4o 売上高のデータを更新したいんです。 DBは2つあります。変換マスタ、売上高 ○変換マスタのデータ 変換コード 得意先コード   得意先名  1      100      あああ  2      200      いいい  3      300      ううう っいう風にデータがあります。 ○売上高のデータ 変換売上コード 売上名  1       NULL  2       NULL  3       NULL  4       NULL ていう風にデータがあります。 ●更新後の売上高のデータ 変換売上コード 売上名 100      あああ 200      いいい 300      ううう  4       NULL 変換マスタの変換コードと売上高の変換売上コードが一緒なら変換マスタの得意先コードのデータを 売上高の変換売上コードを更新し、変換マスタの得意先名を売上高の売上名に更新したいんですが自分で書いたソースでは更新後の変換売上コードの「4」→「NULL」になって帰ってくるんです。変換マスタになかったらそのままのデータにしたいのですが、どうかお願いします。ソース乗せます。 W_SQL = "UPDATE " W_SQL = W_SQL & "売上高 " W_SQL = W_SQL & "SET ( " W_SQL = W_SQL & "売上高.変換売上コード,売上高.売上名) = " W_SQL = W_SQL & "( SELECT 得意先コード,得意先名" W_SQL = W_SQL & " FROM 変換マスタ WHERE 売上高.変換売上コード = 変換マスタ.変換コード)"

  • SQL SERVER2005でシフト表を出力したい

    社員のシフト管理表を作成しています。 visual web developer2008とSQL Server2005にて社内で利用するWEBアプリを作成しています。 CSVにてエクスポートしたいという要件が出てきており、その抽出条件が私には難しくお知恵をお借りしたいと思い投稿いたしました。 予定テーブル(tbl_yotei)には日付と必要人数と場所が入っており、社員予定テーブル(tbl_shain_yotei)には予定IDと社員名が入っています。 ■予定テーブル(tbl_yotei) yotei_id  jishi_day   ninzu   shiten 1      2011/7/1   2     支店A 2      2011/7/2   1     支店A 3      2011/7/3   3     支店A 4      2011/7/2   1     支店B 5      2011/7/3   2     支店B 6      2011/7/4   3     支店A ------ ■社員予定テーブル(tbl_shain_yotei) shain_yotei_id   yotei_id   shain_nam 1           1        田中 2           1        山根 3           2        杉下 4           3        田中 5           3        一条 6           4        魚島 これを予定テーブルの人数分の行を表示し、その行にアサインされている社員が表示される表を作成したくご質問いたしました。 まだアサインされていない予定については社員はnullで人数分の行を作成したいと思います。 入力時の制限として予定テーブルに入力されている「人数」よりも多い数の社員は割り当てていません。予定テーブルのある行の人数が2なら社員予定テーブルの行数は0~2行までです。 ストアドプロシージャで予定テーブルに入っている人数分の行を出力する事は出来たのですが、そこから社員予定テーブルを参照して下記のような表になるようにする方法がわかりません。 例えば tbl_yoeti.yotei_idが3のレコードは3行表示し、shain_yotei_id.yotei_idが3のレコードは2行あるので2行はshain_namに社員の氏名が入り、1行はshain_namがnullのレコードを表示させたいです。 yotei_id  jishi_day  ninzu  shiten  shain_yotei_id  shain_nam 1      2011/7/1  2    支店A    1        田中 1      2011/7/1  2    支店A    2        山根 2      2011/7/2  1    支店A    3        杉下 3      2011/7/3  3    支店A    4        田中 3      2011/7/3  3    支店A    5        一条 3      2011/7/3  3    支店A    Null      Null 4      2011/7/4  1    支店B    6        魚島 5      2011/7/5  2    支店B    Null      Null 5      2011/7/5  2    支店B    Null      Null 6      2011/7/6  3    支店A    Null      Null 6      2011/7/6  3    支店A    Null      Null 6      2011/7/6  3    支店A    Null      Null ---- 出来ているストアドプロシージャ CREATE PROCEDURE dbo.StoredProcedure2 DECLARE @yotei_id int DECLARE @jishiday datetime DECLARE @ninzu int DECLARE @shiten nvarchar(50) DECLARE c_yotei cursor FOR SELECT yotei_id,ninzu,jishiday,shiten FROM tbl_yotei CREATE TABLE #TMP ( yotei_id int,ninzu int, jishiday datetime, shiten nvarchar(50) ) OPEN c_yotei FETCH NEXT FROM c_yotei INTO @yotei_id, @ninzu, @jishiday, @shiten WHILE @@FETCH_STATUS = 0 BEGIN DECLARE @kaisu int SET @kaisu = 1 WHILE @kaisu <= @ninzu BEGIN INSERT INTO #TMP ( yotei_id,ninzu,jishiday,shiten ) VALUES ( @yotei_id,@ninzu,@jishiday,@shiten ) SET @kaisu = @kaisu + 1 END FETCH NEXT FROM c_yotei INTO @yotei_id, @ninzu, @jishiday, @shiten END CLOSE c_yotei DEALLOCATE c_yotei /* ここからどのようにしたらよいでしょうか。。 */ SELECT * FROM #TMP RETURN ---- 上記のストアドからでも全く新しいアイデアでもかまいませんので皆様お知恵をお貸しください。 どうかよろしくお願いいたします。

  • 外部結合でのcount結果でゼロを表示

    以下の様なテーブルがあります。 テーブルを結合してカウントを行っているのですが、 tbl1の商品コードに存在しないユーザが存在しない場合や tbl3のフラグが”0”または”1”が存在しない場合、 ゼロ件と出したいのですが出力されません。 どうすれば期待した結果になるか教えて下さい。 ■tbl1 ID SYOHIN_CODE ---- ----------- 1 A01 2 B01 3 C01 4 D01 5 E01 ■tbl2 ID NUM SYOHIN_ID ---- ------- --------- 1 NUM001 1 2 NUM002 2 3 NUM003 3 4 NUM004 4 5 NUM005 1 6 NUM006 1 7 NUM007 2 8 NUM008 3 9 NUM009 4 10 NUM010 1 ■tbl3 ID NUM_ID FLG ---- -------- ---- 1 1 1 2 2 1 3 3 1 4 4 0 5 5 0 6 6 0 7 7 0 8 8 1 9 9 0 10 10 0 ■実行した結果 SYOHIN_CODE FLG CNT ----------- ---- --------------- A01 0 3 A01 1 1 B01 0 1 B01 1 1 C01 1 2 D01 0 2 ■期待する結果 SYOHIN_CODE FLG CNT ----------- ---- --------------- A01 0 3 A01 1 1 B01 0 1 B01 1 1 C01 0 0 C01 1 2 D01 0 2 D01 1 0 E01 0 0 E01 1 0 実行したSQL select T1.syohin_code,T3.flg,count(T2.num) cnt from tbl1 T1 inner join tbl2 T2 on T1.id=T2.syohin_id inner join tbl3 T3 on T2.id=T3.num_id group by T1.syohin_code,T3.flg order by T1.syohin_code ;