- ベストアンサー
- すぐに回答を!
複数テーブルのリレーションについて
こんにちは。 oracleの複数テーブルのリレーションについてご教示頂け ないでしょうか? 実現したいことは下記の通りです。 ■oracleのバージョン oracle 8i 言語 VS2005 VB.net ■実現したいこと 下記の(1)の抽出条件で絞り込んだ(2)の情報を表示 (1)抽出条件 (1)【Table A】の【更新日時】が指定の日時と合致する (2)【Table A】の【入力者ID】にひもずく 【Table C】の【区分名称】が 指定されたものと合致する (2)表示したいカラム (1)【Table A】の【入力者ID】に該当する【Table B】の【名前】 (2)【Table A】の【修正者ID】に該当する【Table B】の【名前】 ■■■■■■具体例です■■■■■■■■■■■■■■■■■■■ 各テーブルに以下のようなデータが入力されている場合 画面から下記(1)・(2)の抽出条件がが選択された場合 下記の内容を表示したいと考えています。 ■抽出条件 (1)日時=20009/06/12 (2)区分名称=テスト ■表示結果 入力者 :001-山田 修正者 :002-田中 更新日時:20009/06/12 【Table A】 | 入力者ID | 修正者ID | 更新日時 | ------------------------------------- | 001 | 002 | 20009/06/12 | | 003 | 002 | 20009/06/12 | 【Table B】 | ID | 名前 | 区分NO | ----------------------------- | 001 | 山田 | 1 | | 002 | 田中 | 2 | | 003 | 鈴木 | 2 | 【Table C】 | 区分NO | 区分名称 | ---------------------- | 1 | テスト | | 2 | 本番 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 現状以下の方向で進めようとしてるのですが、 これだと「区分名称=テスト」という抽出条件が 追加できずに困っています。 select * from 【Table A】 INNER JOIN 【Table B】 B_1 ON (【Table A】.入力者ID = B_1.ID) INNER JOIN 【Table B】 B_2 ON (【Table A】.修正者ID = B_2.ID) Where 【Table A】.更新日時 = '20009/06/12' 以上、宜しくお願い申し上げます。
- alp_tomy
- お礼率56% (21/37)
- Oracle
- 回答数2
- ありがとう数5
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
- 回答No.2
- yamada404
- ベストアンサー率56% (9/16)
これでどうでしょうか。 select * from 【Table A】 INNER JOIN 【Table B】 B_1 (【Table A】.入力者ID = B_1.ID) INNER JOIN 【Table B】 B_2 (【Table A】.修正者ID = B_2.ID) INNER JOIN 【Table C】 ( B_1.区分NO = 【Table C】.区分NO) where 【Table A】.更新日時 = '20009/06/12' and 【Table C】.区分名称 = 'テスト'
その他の回答 (1)
- 回答No.1
- Idler999
- ベストアンサー率27% (63/231)
区分名称ではなく、区分No.が抽出条件の方が良いと思いますが、それはおいといて。(区分名称で一意になるのですよね?) 区分名称から絞っていった方が良いと思います。 まず、区分名称「テスト」に該当するCの区分No.を持つBを抽出。・・・B’ B’のIDが、入力者IDに含まれるAを抽出・・・A’ A’の中から、更新日時が「○月×日」のレコードを抽出し、IDでBから入力者と修正者の名前を持ってくる。 一文にすると複雑になるのでSQLを分けても良いと思います。
質問者からのお礼
早速のご回答ありがとうございました。 下記の方法で実装できました。。。 ありがとうございました。(^_^) --------------------------------- select * from 【Table B】B_1 INNER JOIN 【Table C】 C ON (B_1.区分NO= C.区分NO) LEFT OUTER JOIN 【Table A】 A ON (A.入力者ID = B_1.ID) LEFT OUTER JOIN 【Table B】 B_2 ON (A.修正者ID = B_2.ID) Where 【Table A】.更新日時 = '20009/06/12' AND C.区分名称 = 'テスト'
関連するQ&A
- accessで、2テーブル間で複数のリレーションをしたい
access初心者です。 2テーブル間で複数のリレーションをしたいと思うのですが、どうすればよいのでしょうか? 下記例で「担当者」と「対応具体的内容」を結びつける一覧を抽出をしたいのです。 対応のたびに(対応日付ごとに)担当者が違います。 「対応具体的内容」は「対応内容区分」ごとに分け、各担当者が入力している。 擬似例) テーブル1: 顧客ID 対応日付 担当者 テーブル2: 顧客ID 対応日付 対応内容区分 対応具体的内容 こんな感じで、作られてしまっています。 顧客IDでのリレーションで、「テーブル1」の対応日付で抽出すると、担当者と対応具体的内容は一致しません。(1担当者に過去の全ての対応内容が抽出される) また、「テーブル2」の対応日付で抽出すると、その日付の対応内容に対し、過去全ての担当者が抽出されてしまいます。 担当者と対応具体的内容を結びつける為には、 顧客IDと対応日付とを一致させる必要があるように思うのです。 御教授よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- 外部キーが設定されているテーブルのupdateについて
PostgreSQL8.24を利用しています。 pgADMINIIIでテーブルを作成しました。 【TABLE_A】と【TABLE_B】があります。 【TABLE_A】の【ID】が【TABLE_B】の【ID2】が外部キーとして設定してあります。 CONSTRAINT TABLE_B_fkey FOREIGN KEY (ID2) REFERENCES TABLE_A (ID) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION 上記のように記述されています。 SQL文のUPDATEを使い、IDが「01」を「05」に更新したいのですが、 以下のように記述するとエラーになります。 どのようなUPDATE文を記述すればよろしいのでしょうか。 UPDATE TABLE_A INNER JOIN TABLE_B on TABLE_A.ID=TABLE_B.ID2 SET TABLE_A.ID = '05',TABLE_B.ID2 = '05' WHERE TABLE_A.ID='01'" よろしくお願いいたします。
- ベストアンサー
- PostgreSQL
- テーブル結合の条件指定について
以下のようなテーブルが3つある場合に2つのテーブルにあるポイントを合計して取得したいと思っています。 ただ、外部結合しているtable_cに条件を与えるとうまく取得できません。 table_cにcdがある場合は条件を指定し、 ない場合は条件を指定しないようにするにはどうすればいいのでしょうか。 【table_a】 id name ------------------ a1 aaa a2 bbb a3 ccc 【table_b】 b_id a_id user_id point --------------------------------- b1 a1 00001 5 b2 a1 00002 2 b3 a3 00007 10 b4 a2 00356 10 【table_c】 c_id user_id cd bonus_point ------------------------------------------------ c1 00001 cd_1 1 c2 00007 cd_2 1 c3 00356 cd_1 1 SELECT table_b.user_id as user_id , (ifnull(table_b.age_count) + ifnull(table_c.bonus_point, 0)) as total_point FROM table_a INNER JOIN table_b ON (table_b.a_id=table_a.a_id) LEFT JOIN table_c ON (table_c.user_id=table_b.user_id) WHERE table_c.cd = 'cd_1' ORDER BY total_point desc ■結果 user_id total_point ----------------------------- 00356 11 00001 6 ■求めたい結果 user_id total_point ----------------------------- 00356 11 00001 6 00002 2 よろしくお願いします。
- ベストアンサー
- MySQL
- 1テーブル&複数レコードの更新に対して1度のupdate文での処理方法
1テーブル&複数レコードの更新に対して1度のupdate文での処理方法 Delphi2010+SQL SERVER 2005で開発しています。 update文で、 現在下のようにwhileで複数レコードに対して、 1回、1回、sqlを発行して、更新しています。 これを、一度のSQLの発行で処理できないものでしょうか? 更新テーブルは1つで、更新する項目も同じです。 更新するデータと、where句の条件が異なります。 もし可能なようでしたら、どうかご教授お願いします。 update table set A=1,B=2 where id=1 update table set A=2,B=3 where id=5 update table set A=9,B=99 where id=7 update table set A=5,B=10 where id=15 update table set A=1,B=10 where id=75
- ベストアンサー
- SQL Server
- 複数テーブルの結合
マスターテーブル1つと、子テーブルが複数存在して子テーブルにはマスターテーブルのidを格納するフィールドがあり参照しなくなったときにはそのidを消去するといったデータベースがあったときにマスターIDごとに子テーブルのどれか1つでも参照していればカウントするみたいなSQLをつくりたいんですが select count(m.id) from master m inner join a on m.id = a.m_id inner join b on m.id = b.m_id inner join c on m.id = c.m_id group by m.id みたいなSQLだとAにデータが存在しなければB以降に存在しても期待した結果が出力されません。A、B、Cいずれかのm_idとマスター側のIDが等しければカウントするという出力をするためにはどのように書けばいいんでしょうか。 わかりづらい説明で申し訳ありませんがよろしくお願いします。
- ベストアンサー
- MySQL
- 複数のテーブルからのデータ抽出
こんばんは。お世話になっております。 テーブル(A) id | no | image -------------------- 1 | みかん| aaa.gif 2 | なし | bbb.gif 3 | いちご| ccc.gif テーブル(B) m_id | t_id ---------------- 1 | 3 2 | 2 1 | 2 というようなテーブルがあるのですが、テーブルBのm_id、1を検索した際、t_idを抽出、かつそのt_idと同じ番号であるテーブルAのimageをも抽出したいと考えています。 結果としては、以下のような感じ。 3 ccc.gif 2 bbb.gif $m_id =$_GET["id"]; //途中省略 $sql= "select * FROM B INNER JOIN A ON B.m_id = A.id WHERE m_id = '$m_id'"; としているのですが、テーブルBのt_idは検索されるものの、テーブルAのimageは全てaaa.gifと返ってきてしまいます。 先日、こちらでテーブルの正規化として、データを分散させる考え方をお教え頂き、早速それに習って構成してみたのですが、思うようにデータを抽出出来ずにアドバイスを頂戴したく投函させていただきました。 先のソースで可笑しな点などの忠告や、アドバイスなど頂戴できれば幸いです。宜しくお願い致します。
- ベストアンサー
- MySQL
- 複数テーブル表示
こんにちは、 元テーブル⇒取引先テーブル⇒取引先名称テーブル構成から最終的に 結果SQLのように取引先名称1、取引先名称2を 出力したいと思っているのですが、二つを一緒に抽出させることが なかなか出来ません。 多分、複数のSELECT文をどうにかしないといけないのかとは 思うのですが、情報ありましたらお願い致します。 元テーブル ID l 売先コード l 需要家コード 1 l A l B 2 l C l B 3 l A l C 取引先テーブル ID l 売先、需要家コード l 取引先名刺ID 1 l A l A1 2 l B l B1 取引先名称テーブル ID l 取引先名刺ID l 取引先名称 1 l A1 l 売り先名称 2 l B1 l 需要家名称 結果SQL 売先コード l 需要家コード l 取引先名称1 l 取引先名称2 A l B l 売り先名称 l 需要家名称 C l B l (空白) l 需要家名称 A l C l 売り先名称 l (空白)
- ベストアンサー
- SQL Server
- クエリにおける複数値の抽出について
クエリにおける複数値の抽出について access2007を使用しています。 テーブルA,テーブルBを元にクエリCを作成しました。 テーブルAには担当というフィールドがありますが,複数の値の入力を許可しており,テーブルBを値集合ソースとして設定してあります。 クエリCにおいて,以下のような抽出をしたいと考えています。 例えば, ID_所員ID_担当 001_B001,B002,B003_山田,佐藤,鈴木 002_B002_佐藤 003_B001,B002_山田,佐藤 において,所員IDの抽出条件のところにB002と入力すると,ID002のみが抽出されるといった感じです。 B002と抽出条件を設定すると,B002を含む全てのレコードが抽出されてしまいます。この場合ですと,ID001から003の全てのレコードが抽出されます。 担当のところで抽出条件を佐藤と設定し,さらに所員IDの抽出条件のところに,Len関数を使用して4文字以下とすれば…とも考えたのですが上手くいきません。 もし,良い方法があればご教示ください。
- 締切済み
- その他MS Office製品
- 複数行の結果を単一列に連結(複数のテーブルを参照)
psql (PostgreSQL) 7.3.4です。 困っています 以下のような【TABLE1】と【TABLE2】を TABLE1のt1tot2にで結合した結果を 【A.結果】のように★▲●の行を1行に表示させて取得したいのですがうまくいきません。 【TABLE1】 ID,ID_SUB, TYPE, VALUE A A1 t1 1 ★ A A1 t2 2 ★ A A1 t1 1 ▲ A A1 t2 3 ▲ B B1 t1 1 ● B B1 t2 3 ● 【TABLE2】 ID, TYPEV1 ,TYPEV2 ,Code A 1 1 AAA1 A 1 2 AAA2 ★ A 1 3 AAA3 ▲ B 1 3 BBB1 ● TYPEV1=TABLE1のt1の値 TYPEV2=TABLE1のt2の値 【得たい結果】 ID, ID_SUB, TYPEV1, TYPEV2,Code A A1 1 2 AAA2★ A A1 1 3 AAA2▲ B B1 1 3 BBB1● 下記でTABLE1の2行を1行にまとめることができましたが、 問題のTABLE2との連結方法が分かりません。 select TABLE1.ID , TABLE1.ID_SUB , TABLE1.VALUE as t1 , (SELECT tbl1.VALUE FROM TABLE1 tbl1 where tbl1.TYPE=t2 and (TABLE1.ID , TABLE1.ID_SUB)=(tbl1.ID , tbl1.ID_SUB)) as t2 from TABLE1 where TABLE1.TYPE = t1 【結果】 ID ,ID_SUB , t1 ,t2 A A1 1 2 ★ A A1 1 3 ▲ B B1 1 3 ● 何か良い方法はありますでしょうか?
- 締切済み
- PostgreSQL
- テーブルのどちらかにデータがない事があるテーブル結合について
■table a のテーブル構成 date a_id b_id c_id a_count ■table b のテーブル構成 date a_id b_id c_id b_count value 上記の2つのテーブル構成から、 ■date a_id b_id c_id毎の集計データ date a_id b_id c_id a_count b_count value を抽出するSQLが知りたいです。 table aにあって、table bに存在しない。又は逆もある為、 union しかないと思うのですが、思いつきません。。
- ベストアンサー
- MySQL
質問者からのお礼
早速のご回答ありがとうございました。 下記の方法で実装できました。。。 ありがとうございました。(^_^) --------------------------------- select * from 【Table B】B_1 INNER JOIN 【Table C】 C ON (B_1.区分NO= C.区分NO) LEFT OUTER JOIN 【Table A】 A ON (A.入力者ID = B_1.ID) LEFT OUTER JOIN 【Table B】 B_2 ON (A.修正者ID = B_2.ID) Where 【Table A】.更新日時 = '20009/06/12' AND C.区分名称 = 'テスト'