- PR -

サブクエリでのレコード取得について質問させてください。

1
投稿者投稿内容
馬岱
常連さん
会議室デビュー日: 2007/12/05
投稿数: 21
お住まい・勤務地: 五丈原
投稿日時: 2007-12-05 17:03
サブクエリを用いたSQL文について教えていただけませんでしょうか。

内容は、

Aテーブル     Bテーブル
キー項目aaa    キー項目aaa
            枝番bbb

この2テーブルをJOINしてAテーブルのキー項目ごとに紐づいた一番小さい枝番を取得するというものなのですが、
当初、

SELECT *
FROM Aテーブル
INNER JOIN Bテーブル
ON Aテーブル.キー項目aaa = Bテーブル.キー項目aaa
where = (
     select min(Bテーブル.枝番bbb)
     from Bテーブル
     )

これで問題無いかと思っていたのですが、これでは全レコード中一番小さい枝番の値と
同じ値が入っているレコードの取得 となってしまうようで、
私が意図しているデータが得られませんでした。
キー項目ごとに紐づいた枝番で、一番小さい数値の一覧を取得する場合、
どのような記述を行うべきなのでしょうか?
検索で色々なページを参照しましたが、このようなケースが記載されているページはありませんでした。

環境はSQL Server2005です。
よろしくお願い致します。


[ メッセージ編集済み 編集者: 馬岱 編集日時 2007-12-05 17:04 ]

[ メッセージ編集済み 編集者: 馬岱 編集日時 2007-12-05 17:05 ]

[ メッセージ編集済み 編集者: 馬岱 編集日時 2007-12-05 17:05 ]
crab
会議室デビュー日: 2006/12/25
投稿数: 11
投稿日時: 2007-12-05 17:43
キー項目ごとの枝番の最小値であれば、Bテーブルだけでも取得できるのでは?

select キー項目aaa,min(枝番bbb) from Bテーブル
group by キー項目aaa

また、これと一緒にAテーブルのキー項目以外のカラムも表示したいのであれば、

select
A1.*,
A2.枝番最小値
from
Aテーブル A1,
(select キー項目aaa,min(枝番bbb) as 枝番最小値 from Bテーブル
group by キー項目aaa ) A2
where
A1.キー項目aaa = A2.キー項目aaa

で、いかがでしょうか。

よっし〜。
ベテラン
会議室デビュー日: 2007/04/17
投稿数: 89
お住まい・勤務地: 北のほうの国
投稿日時: 2007-12-05 17:47
Bテーブルの一番小さい枝番を拾うために
キー項目aaaでグループしたBテーブルを作成(エイリアス名'B2')
もとのBテーブルにくっつけて最小枝番だけのテーブルBを作成
あとはそれとAテーブルを JOIN させればよいかと。
コード:


SELECT * FROM Bテーブル B1
INNER JOIN (SELECT キー項目aaa,MIN(枝番bbb)AS'最小枝番bbb' FROM Bテーブル GROUP BY キー項目aaa) AS 'B2'
ON B1.キー項目aaa=B2.キー項目aaa AND B1.枝番bbb=B2.最小枝番bbb


//編集
かぶった。
私のはBテーブル軸ですね…。

[ メッセージ編集済み 編集者: よっし〜。 編集日時 2007-12-05 17:52 ]
こあら
大ベテラン
会議室デビュー日: 2007/06/26
投稿数: 157
投稿日時: 2007-12-05 18:06
> 一番小さい枝番

「枝番」て意味の無いシーケンシャルの値ってイメージがあります。
大抵の場合、0とか1じゃないですか?

とまあそれはさておき、以前類似スレッドがありましたよ。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=41134&forum=26
馬岱
常連さん
会議室デビュー日: 2007/12/05
投稿数: 21
お住まい・勤務地: 五丈原
投稿日時: 2007-12-06 10:02
レスありがとうございます。

crabさんとよっし〜。さんのやり方で、意図したデータの取得が出来ました!
本当にありがとうございますm(_ _)m

>こあらさん
枝番そのものはシーケンシャルでふられるのですが、
その枝番レコードは無作為に削除される為に、
今回は抜き出す枝番付きのレコード番号を決め撃ち出来ませんでした。
後付情報で申し訳ありません。
指摘いただいたスレッドもこちらを立てる前に見ているのですが、
類似ケースだということがわかりませんでした…これから精進したいと思います。

皆さん本当にありがとうございました。

検索で役立つかもしれないので、今回のコードを私が解釈した内容で
以下に記述します。


・crabさんのコード
select A1.KEYno,
    A2.MIN_SEQno
from Table_A A1,
        (
        select KEYno,
            min(SEQno) as MIN_SEQno
        from Table_B
        group by KEYno
         ) A2
where A1.KEYno = A2.KEYno

・よっし〜。さんのコード
select *
from Table_B B1
inner join (
        select KEYno,
            MIN(SEQno) as MIN_SEQno
        from Table_B
        group by KEYno
       ) as B2
on B1.KEYno = B2.KEYno
and B1.SEQno = B2.MIN_SEQno
1

スキルアップ/キャリアアップ(JOB@IT)