プロが教えるわが家の防犯対策術!

質問です。
下記のテーブルとデータがあり、
取得想定結果のように出力したいです。

下記のsqlだと003は同じ登録日ですので2行検索されてしまいます。
なので、登録日のminではなく、確認番号の昇順の並べた際の1行目のデータを取得できるようにして取得結果のデータを抽出したいのですが、どのようにsqlを修正すればよろしいでしょうか。
oracleとなります。

◾️sql

select A.登録番号,氏名,登録日 ,登録時間 ,確認番号氏名
from A inner join B on B.登録番号=A.登録番号
and 登録日=(select min(登録日) from B where B.登録番号=A.登録番号)


◾️Aテーブル
・登録番号 氏名
001 田中
002 田口
003 山本

◾️Bテーブル
・登録番号 登録日 確認番号
001 20230518 k001
002 20230510 k002
003 20230501 k003
003 20230501 k004

◾️取得想定結果
001 田中 20230518 k001
002 田口 20230510 k002
003 山本 20230501 k003

A 回答 (2件)

>4レコード全て取得されてしまいます。


DB-FiddleとOracle Live SQLで試した感じ、回答No.1(ミラ-_-さん)ので、だいたいあってるみたいなので、piraniamanさんがどっか間違えてるか、何か情報が足りないのでは。

添付図は https://www.db-fiddle.com/ で実行。
「質問です。 下記のテーブルとデータがあり」の回答画像2
    • good
    • 0

修正したSQLは次のようになります。



SELECT A.登録番号, A.氏名, B.登録日, B.登録時間, B.確認番号
FROM A
INNER JOIN
(
SELECT 登録番号, 登録日, 登録時間, 確認番号,
ROW_NUMBER() OVER (PARTITION BY 登録番号 ORDER BY 確認番号) AS 行番号
FROM B
) B ON B.登録番号 = A.登録番号
WHERE B.行番号 = 1;


この修正したSQLでは、サブクエリを使用してBテーブルのデータに行番号を付与しています。行番号は確認番号の昇順で付与されます。そして、メインクエリのJOIN条件で行番号が1の行のみを抽出しています。

修正したSQLを実行すると、想定通りの結果が取得できるはずです。ご確認ください。
    • good
    • 0
この回答へのお礼

想定結果通りにならず、4レコード全て取得されてしまいます。

お礼日時:2023/05/24 10:46

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