人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

SQL の表の結合について教えてください。

売上1件1件の発生日時を記録したテーブルAと、売上1件1件の金額を記録したBという2つのテーブルがあるのですが、AからBへはコードではなく次のように行番号によってレコードを参照しているという状況です。

[テーブルA(売上日時データ)のフィールド]
・顧客コード
・売上発生日時
・行番号
(「行番号」は、テーブルB内から該当顧客に対するレコードを抽出したとき、その中の何番目のレコードがこのレコードに対応するかを表す)

[テーブルB(売上金額データ)のフィールド]
・顧客コード
・金額

これら2つのテーブルを元に「顧客コード」「売上発生日時」「金額」を並べた情報を取得したいのですが、「SELECT」一発で決まるようなスマートな方法はあるでしょうか?

一応、ACCESSでの話ですが、SQLの一般論でも結構です。テーブルA、Bの構造は変えることはできないので、DBの設計からやり直せ、という回答はご遠慮ください。

★ 補足のため具体例を画像として添付します。

1170050419
●拡大する

●質問者: you1982
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:access DB SELECT SQL コード
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● いのくに
●0ポイント

LEFT JOIN 等でテーブルを結合すればいいのではないでしょうか?

http://makotowatana.ld.infoseek.co.jp/access/dasqlleftrightjoin....

SELECT
テーブルA.顧客コード,
テーブルA.売り上げ発生日時,
テーブルB.金額
FROMテーブルB
LEFT JOINテーブルA
ONテーブルB.顧客コード = テーブルA.顧客コード
◎質問者からの返答

上記の例ですと、テーブルB側のレコードが一意に特定されないためうまくいかないのではないでしょうか?


2 ● いのくに
●0ポイント

質問者:you1982 2007-01-29 16:26:43

上記の例ですと、テーブルB側のレコードが一意に特定されないためうまくいかないのではないでしょうか?

テーブルBに一意に特定できる主キーのようなものが示されていないので、

一意に特定できないのはいたしかたないかと思います。


テーブルBが何の順番で並んでいるのかもよく分かりませんし。

◎質問者からの返答

そのような状況下で何とかしたい、というのが質問の趣旨でした。

コメントで触れたのですが、テーブルBのソート順については一意にソート可能と考えてください。


3 ● b-wind
●80ポイント ベストアンサー

コメントに有るように入力日時カラムが存在し、同じ顧客コードで同一時刻は無いものとして扱います。(出なければまともに検索できませんので)

また、入力日時は昇順で行番号を振ります。


SELECT A.顧客コード,A.売り上げ発生日時,
 B.金額
 FROM テーブルA AS A
 JOIN
 ( SELECT 顧客コード,金額,
 ( SELECT count(*) FROM テーブルB AS B2
 WHERE B2.入力日時 < B1.入力日時
 )+1 AS 行番号
 FROM テーブルB AS B1
 ORDER BY B1.入力日時
 ) AS B
 USING ( 顧客コード,行番号 );

Access で動くかどうかは試してないので分かりません。

コスト度外視なのは元の設計が原因なので諦めてください。

◎質問者からの返答

ありがとうございます!

まだACCESSで試していませんが、効率はともかく、たぶんこれが1番、簡単なSQL文のように見えますね。

おそらくこのb-windさんのご回答で問題解決だと思うのですが、引き続き、Access独自の方法やあるいは裏技(?)的にダイレクトに行番号から引っ張れるような方法がありましたらお願い致します。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ