ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.3321839 2つのテーブルを結合して最大値を取得したい
質問者:kuriosprj 2つのテーブルを結合(INNER JOIN)して、ある列の最大値を取得する方法を教えてください。

例えば、
出荷ファイルと出荷明細ファイルの2テーブルで、出荷日の列をキーとして結合します。
この2テーブルで出荷番号という列の最大値を取得したいのです。

具体例では、
出荷日が2テーブルとも8/6があるとして、
出荷ファイル.出荷番号 の最大値が”5”で、
出荷明細ファイル.出荷番号の最大値が”6”の場合、
結果として、”6”を取得できれば良いのです。

よろしくお願いします。
困り度:
  • すぐに回答を!
質問投稿日時:
07/09/06 22:00
この質問に対する回答は締め切られました。

回答

ANo.3 No1さんの回答の2番煎じです。

<出荷ファイル>
ID__出荷日_________出荷番号
1___2007/08/06__5
2___2007/08/06__7

<出荷明細>
ID__出荷日_________出荷番号__品名
1___2007/08/06__5_____________A
2___2007/08/06__6_____________B

UNION 演算子を使用すると、2 つ以上の SELECT ステートメントの結果を結合して単一の結果セットにできます。
(Books Online)

ですから、<最大値なら単一の結果セット>と考えるでしょう。

select 出荷番号 from 出荷ファイル where 出荷日='2007/08/06'
union
select 出荷番号 from 出荷明細 where 出荷日='2007/08/06'

このSQL文の実行結果は次のようです。

____|出荷番号|
____|____________|
___1|__________5|
___2|__________6|
___3|__________7|

こうなれば、出荷番号=7 を選択するのみ。

select max(出荷番号) As 出荷番号最大値 FROM
(select 出荷番号 from 出荷ファイル where 出荷日='2007/08/06'
union
select 出荷番号 from 出荷明細 where 出荷日='2007/08/06') as ShipNumbers

____|出荷番号最大値|
____|_____________________|
___1|___________________7|

「No1さんの回答の2番煎じ」という理由です。

PS:[素直に考えればunionを使いたくなります]とは、どういう意味なのか?

SELECT * FROM 出荷ファイル AS A INNER JOIN 出荷明細 AS B ON A.出荷日=B.出荷日

____|ID|出荷日_______|出荷番号|ID|出荷日_______|出荷番号|品名|
____|---------------------------------------------------------
___1|_1|2007/08/06|__________5|_1|2007/08/06|___________5|A___|
___2|_2|2007/08/06|__________7|_1|2007/08/06|___________5|A___|
___3|_1|2007/08/06|__________5|_2|2007/08/06|___________6|B___|
___4|_2|2007/08/06|__________7|_2|2007/08/06|___________6|B___|

なるほど、単一の結果セットにならないので最大値を求めるには適しないということなんでしょうね。

※恥ずかしながら、本日、生まれて初めて union なんて使ってみました。
※まあ、便利なものがあったんですね。
回答者:Husky2007
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
07/09/07 20:45
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答良回答20pt

ANo.2 こんなやり方ではどうでしょうか?

SELECT MAX(出荷番号) FROM (SELECT 出荷番号, 出荷日 FROM 出荷 WHERE 出荷日=8/4) AS A INNER JOIN (SELECT 出荷番号, 出荷日 FROM 出荷明細 WHERE 出荷日=8/4) AS B ON A.出荷日=B.出荷日

SQLは、手許に実行環境がないので、不正確です。ニュアンスだけ感じ取ってください^^;
どのDBだとどのSQLが通ったのか、あんまりよく覚えていないので…。
回答者:cieux
種類:アドバイス
どんな人:専門家
自信:参考意見
回答日時:
07/09/06 22:47
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答良回答10pt

ANo.1 SQL Serverは、2000ですか?2005ですか?それとも、別のバージョンですか?

出荷ファイルと出荷明細ファイルは、1:1ですか?
同一出荷日の行は、1行なのですか?それとも、複数行ですか?

出荷ファイル.出荷番号と出荷明細ファイル.出荷明細ファイル.出荷番号という異なる列について、最大値を得るなら、素直に考えればunionを使いたくなります。

select max(出荷番号) from
(select 出荷番号 from 出荷ファイル where <出荷日が8/6を得る条件>
union
(select 出荷番号 from 出荷明細ファイル where <出荷日が8/6を得る条件>) as x

inner joinで、何か得たい情報があるのですか?
回答者:chukenkenkou
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
07/09/06 22:18
この回答への補足SQL Serverは2005です。
また、出荷ファイルと出荷明細ファイルはn:nです。

INNER Joinで得たい情報はないです。出荷番号の最大値だけ得たいのです。

追加ですが、MAX(出荷番号)とありますが、これは、出荷ファイル.出荷番号とか出荷明細ファイル.出荷番号とか指定しなくていいのですか?
この回答へのお礼この回答にお礼をつける(質問者のみ)