- ベストアンサー
日付の前後関係で2つのテーブルを結合したい
world99の回答
- world99
- ベストアンサー率64% (20/31)
k28484 さん 横から余計な口出しをして申し訳ありませんが、テーブル設計が正しく行われていないように思います。 そのため契約明細と契約基本のデータを結合して取得するだけなのに、とても複雑な結合条件が必要でSQL文もかなり複雑になってしまっています。 一般的に親テーブルの主キーで子テーブルのデータを検索できなければなりません。その逆もしかり。 親テーブル「契約基本」の主キーは基本SEQですが、子テーブル「契約明細」にはその基本SEQが含まれていません。 基本契約年月日と明細契約年月日の近いという条件でテーブルを結合するとデータの不整合が起こります。 例えば2人の契約者が違うが同じ契約明細年月日の場合、基本SEQの値が大きい契約基本テーブルのデータを探すと、1人の契約者名しか表示されません。 1人の契約者は1つの契約種別のデータを持たないなら、テーブルを親子に分ける必要がありません。 (契約番号を主キーに持つテーブルがあると見受けられます。契約基本テーブルはそのテーブルの子テーブルなのではないでしょうか?) ■1つのテーブルにした例 契約テーブル 主キー:基本SEQ 【基本SEQ】【契約番号】【契約者名】【基本契約年月日】【契約種別】【明細契約年月日】 1 K0001 契約者1A 2013/05/01 S1 2013/05/05 2 K0001 契約者1B 2013/05/10 S1 2013/05/10 3 K0001 契約者1C 2013/05/20 S2 2013/05/25 4 K0002 契約者2A 2013/06/10 S2 2013/06/10 5 K0002 契約者2B 2013/06/10 S1 2013/06/15 6 K0002 契約者2C 2013/06/10 S2 2013/06/10 7 K0003 契約者3A 2013/07/01 S1 2013/07/05 8 K0003 契約者3B 2013/07/10 S2 2013/07/10 9 K0003 契約者3C 2013/07/10 S1 2013/07/10 1人の契約者が複数の契約種別のテータを持つ場合、テーブルは親子に分けます。親テーブルの主キーで子テーブルのデータを検索できるように子テーブルの主キーを決めます。 ■親子にテーブルを分けた例 契約基本テーブル 主キー:基本契約番号(基本SEQ) 【基本契約番号】【契約番号】【契約者名】【基本契約年月日】 1 K0001 契約者1A 2013/05/01 2 K0001 契約者1B 2013/05/10 3 K0001 契約者1C 2013/05/20 4 K0002 契約者2A 2013/06/10 5 K0002 契約者2B 2013/06/10 6 K0002 契約者2C 2013/06/10 7 K0003 契約者3A 2013/07/01 8 K0003 契約者3B 2013/07/10 9 K0003 契約者3C 2013/07/10 契約明細テーブル 主キー:基本契約番号(基本SEQ)、明細番号 【基本契約番号】【明細番号】【契約種別】【明細契約年月日】 1 1 S1 2013/05/05 1 2 S2 2013/05/10 2 1 S1 2013/05/05 2 2 S2 2013/05/10 3 1 S1 2013/05/05 3 2 S2 2013/05/10 4 1 S1 2013/06/05 4 2 S2 2013/06/10 5 1 S1 2013/06/05 5 2 S2 2013/06/10 6 1 S1 2013/06/05 6 2 S2 2013/06/10 7 1 S1 2013/07/05 7 2 S2 2013/07/15 8 1 S1 2013/07/05 8 2 S2 2013/07/15 9 1 S1 2013/07/05 9 2 S2 2013/07/15
関連するQ&A
- 親子関係を持つテーブルから子テーブルの最新レコードを取得する方法について
親子関係を持つ2つのテーブルから データを取得する方法について質問があります。 下記の2つのテーブルがあったとします。 契約基本(A) 【契約番号】【契約名】 K0001 契約名1 K0002 契約名2 K0003 契約名3 契約明細(B) 【契約番号】【契約種別】 【金額】【契約年月日】 K0001 S1 1000 2005/12/01 K0001 S2 2000 2005/12/02 K0001 S3 3000 2005/12/03 K0002 S1 4000 2005/12/23 K0002 S2 5000 2005/12/22 K0002 S3 6000 2005/12/21 K0003 S1 7000 2005/12/10 K0003 S2 8000 2005/12/12 K0003 S3 9000 2005/12/11 この2つのテーブルを結合して、 契約基本・契約番号毎に最も契約明細・契約年月日が 新しいレコードを取得して下記のような 取得結果を得たいと思っています。 A.K0001,A.契約名1,B.K0001,B.S3,B.3000,B.2005/12/03 A.K0002,A.契約名2,B.K0002,B.S1,B.4000,B.2005/12/23 A.K0003,A.契約名3,B.K0003,B.S2,B.8000,B.2005/12/12 これを1本のSQLで実現する場合、 どのような方法が良いのでしょうか? データベースはOracle9iを使用しています。 恐らく既出の質問だとは思いますが どのようなキーワードで検索して良いのかわからず 質問させてもらいました。 お手数をおかけしますが よろしくお願いします。
- ベストアンサー
- Oracle
- 2つのテーブル結合
Oracle10g使用しています。 テーブルAとテーブルBを結合させてデータを取得したいと思っています。 [テーブルA] ID name 1 A 2 B 3 C 4 D [テーブルB] ID SEQ VALUE 1 1 111 2 1 222 2 2 333 3 1 444 4 1 555 4 2 666 4 3 777 テーブルAのキーは[ID]、テーブルBのキーは[ID,SEQ]です。 この二つを連結して以下のように出力したいと思っています。 ID SEQ NAME VALUE 1 1 A 111 2 2 B 333 3 1 C 444 4 3 D 777 テーブルBのデータは同じIDのうち最大のSEQのものを取得したいのですが よいSQLが思いつきません。 よい方法があればご教授ください。 よろしくお願いいたします。
- ベストアンサー
- Oracle
- アクセス 結合プロパティ が正しく結合されない(アクセス初心者です)
請求明細テーブルと、支払明細テーブルの指定伝票番号で結合して、 請求明細テーブルの全レコードと、支払明細テーブルの請求明細テーブルと一致するレコードだけを表示させたく、結合プロパティをそのように設定しました。 SQLは、下記のようになりました。 select 請求明細.指定伝票番号, 請求明細.計 from 請求明細 left join 支払明細 on 請求明細.指定伝票番号=支払明細.指定伝票番号 すると、思わぬことがおきました。 請求明細テーブルの全レコードが表示されず、一部欠落してしまいました。 同じような質問をしている人の、回答を見させていただいたところ、上記のSQLで合っているようでした。 一体なにが起きているんでしょうか??教えてください。
- ベストアンサー
- オフィス系ソフト
- テーブルを結合
テーブルの結合に関して質問します。 ネットなどでinner joinを使った複数のテーブル結合が参考として 書いてあったのですが(3つまで), 4つテーブルを結合する事は 出来るのでしょうか? A,B,CテーブルにはID,NAMEがあります。 DテーブルにはA,B,CテーブルのIDがあります。 参考サイトを見て3つのテーブルを結合するSQLが以下になります。 SELECT a.name, b.name, c.name FROM a INNER JOIN (b INNER JOIN c ON b.id = c.id) ON a.id = c.id よろしければアドバイスお願いします。
- ベストアンサー
- Oracle
- テーブル結合について
テーブルの結合についてお聞きしたいことがあります。 カラム「KEY」を結合条件に テーブルA、B、Cを結合して【取りたい結果】のようなデータを取りたいと思っています。 しかし、テーブルAにBとCをLEFT JOINを結合した所、 【取得された結果】のデータが取得されました。 どのような結合をしたら期待通りの結果が得られるのでしょうか? 回答宜しくお願いします。 【取得された結果】 key dataA dataB dataC ------------------------------------------------- 1 A-1 B-1 C-1 A-1 B-1 C-2 A-1 B-1 C-3 2 A-2 3 A-3 【取りたい結果】 key dataA dataB dataC ------------------------------------------------- 1 A-1 B-1 C-1 A-1 C-2 A-1 C-3 2 A-2 3 A-3 【テーブルA】 key dataA --------------------- 1 A-1 2 A-2 3 A-3 【テーブルB】 key dataB --------------------- 1 B-1 【テーブルC】 key dataC --------------------- 1 C-1 1 C-2 1 C-3
- 締切済み
- Oracle
- 内部結合のSQL文
次のような条件でのSQL文はどのように書けばよいのでしょうか? 売上テーブル(フィールドは「売上No.」)と売上明細テーブル(フィールドは「売上No.」「行番号」)を内部結合します。 結合の条件は売上明細テーブルの売上No.が売上テーブルの売上No.と等しいもの、かつ売上明細テーブルの行番号の一番小さいもの、です。 行番号はユニークですが、必ずしも1から順に振られているとは限りません。 どうぞよろしくお願いします。
- ベストアンサー
- その他(データベース)
- テーブルの結合について
テーブルの結合について あるテーブルのサブクエリAがあるとして 抽出条件違いのサブクエリA’を 結合条件無しで(クロス結合で)、外部結合したいのですが そのようなことは可能でしょうか? サブクエリAのデータは残したいのです。 よろしくお願いします。
- ベストアンサー
- Oracle
- 複数テーブルを結合するには?
OS:WINDOWSXP SP2 ORACLE:Oracle9i Enterprise Edition Release 9.2.0.1.0 A, B, Cというテーブルがあるとします。 それぞれのテーブルには XXカラムと YYカラムがあるとします。 2つのテーブルを結合させるには、以下のSQL文を記述すれば良いと考えています。 SELECT A.*,B.* FROM A JOIN B ON A.XX = B.XX 3つのテーブルを結合するには、以下のSQL文を記述しています。 SELECT A.*,B.*,C.* FROM A JOIN B ON A.XX = B.XX JOIN C ON A.XX = C.XX 但し、この記述方法でいきますと、Cテーブルを右側外部結合に指定した場合のみ、 ORA-00904 "C" 無効な識別子です。 というエラーメッセージが表示されます。 SELECT A.*,B.*,C.* FROM A JOIN B ON A.XX = B.XX RIGHT OUTER JOIN C (←LEFT OUTER、FULL OUTER)なら通ります) ON A.XX = C.XX 何故、右側外部結合のみ不正となるのか不明であり、解決策が見つかりません。 複数のテーブルを結合する為のSQL文の記述方法を教えて頂けますでしょうか?
- ベストアンサー
- Oracle
- 固定値を含む結合と複数テーブルの結合について
「1.固定値を含む結合」と「2.複数テーブルの結合」について教えて下さい。 最近oracleを使い始めてSQLで表の結合を書く場面があるんですが LEFT(RIGHT) JOIN を使うのか、(+)を使って書くのかで迷っています。 LEFT(RIGHT) JOINだと固定値を含めて外部結合しようとするとエラーになってしまいます。 それが嫌で(+)を使っていたんですが 今度は複数のテーブルを(+)で結合しようとするとエラーになってしまいます。 (AテーブルとBテーブル、AテーブルとCテーブルなど?) こういう場合はどうすれば良いのでしょうか? とりあえず副参照をFROMに指定して対処してるんですが 何かきちんとした書き方があるのでしょうか?誰か教えて下さい。
- ベストアンサー
- Oracle
お礼
ご指摘ありがとうございます。 余計な口出しではございません。 大変参考になりました。 親子テーブルの契約は、法人を対象としており、 契約者名は、契約担当者名だとお考え下さい。 なので例でいうと、K001は全て同じ法人となります。 今回やりたかったのは、契約明細が締結された時点で、 その親の契約基本の内容はどうだったのか、という一覧を 得たかったのです。 いただいたご指摘は今後のテーブル設計の参考にさせて いただきます。 ありがとうございました。