プロが教える店舗&オフィスのセキュリティ対策術

たびたびお世話になります。

仮に以下のようなテーブルを考えるとします。

○テーブルA (伝票)
伝票番号 (PK)
顧客コード

○テーブルB (伝票明細)
伝票番号 (PK)
伝票明細 (PK)
注文コード
大盛り区分

レストランなどでお客さんが注文した注文伝票を
想像していただければ良いかと思います。
一つの伝票番号に対して、複数の伝票明細があると。
DB上は上記のように格納するとします。

ここでテーブル結合を使って、各伝票の1行目の明細を表示しながら
SQL1発で抜いてきたいと思います。どういうSQLを考えたら良いでしょうか?

テーブルBの表示項目が1つだけなら、

SELECT A.伝票番号, A.顧客コード, (SELECT TOP 1 注文コード FROM テーブルB B WHERE A.伝票番号 = B.伝票番号)
FROM テーブルA A

で良いのですが、複数項目となるとどうやったら良いのか判りません。

A 回答 (3件)

 テーブルBの1行目レコードというのを、どう定義するかによって、答えが変わると思います。


 
例えば、テーブルBの伝票明細が1から順にふられる数字であって、その伝票明細=1のものだけ取ってくれば良いというのであれば、SQL文はいたってシンプルになるかと思います。
 
 SELECT A.伝票番号,A.顧客コード,B.伝票明細,B.注文コード,B.大盛り区分
FROM テーブルA AS A
INNER JOIN テーブルB AS B
ON A.伝票番号=B.伝票番号
AND B.伝票明細=1

こんな感じでしょうか。

 伝票明細が1から始まらず、「TOP 1」を使うというのであれば

 SELECT A.伝票番号,A.顧客コード,B.伝票明細,B.注文コード,B.大盛り区分
FROM テーブルA AS A
INNER JOIN テーブルB AS B
ON A.伝票番号=B.伝票番号
WHERE B.伝票明細=(SELECT TOP 1 C.伝票明細 FROM テーブルB AS C WHERE B.伝票番号=C.伝票番号)

こんな感じになります。この場合EXIST使ったりIN使ったり、細かい事を言えば色々方法はあるかと思います。でも基本的な考えは同じようなものです。

 
    • good
    • 1

select y.*,z.*


from
(
select
a.伝票番号,
(select top 1 伝票明細 from テーブルB as b where a.伝票番号=b.伝票番号 order by b.伝票番号,b.伝票明細)
from テーブルA a
) as x
join テーブルA as y on (x.伝票番号=y.伝票番号)
join テーブルB as z on (x.伝票番号=z.伝票番号 and x.伝票明細=z.伝票明細)

みたいな感じでキーリスト(x)を作ってしまうと、後はどうにでも成るように
思います。(SQLは未検証です)

もっとも、キーリストの部分は、伝票番号配下の決定要素が1つなら、

select y.*,z.*
from
(
select 伝票番号,min(伝票明細) as 伝票明細 from テーブルB group by 伝票番号
) as x
join テーブルA as y on (x.伝票番号=y.伝票番号)
join テーブルB as z on (x.伝票番号=z.伝票番号 and x.伝票明細=z.伝票明細)

と簡素に済ませても良いかと思います。
    • good
    • 2

似たようなケースだと思います


参考にしてください

参考URL:http://okwave.jp/kotaeru.php3?q=1790207
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す