製品の登録に一致するものがない場合は、一致する日付を1日だけ変更する必要があるという印象を受けています。だから私はそれを単に結合し、これがあなたが望むものだと思います
select p1.product_reg_no,
p1.product_no product_no_1,
p2.product_no product_no_2,
p1.start_date start_date_1,
nvl(p2.return_date,p2.end_date) return_or_end_date_2
from products p1
join products p2 on (p1.product_reg_no = p2.product_reg_no)
where p1.start_date-1 = nvl(p2.return_date,p2.end_date)
SQLフィドル
グループ化が間違っていた場合は、結合条件をそのままにして、指定された例の製品テーブルで同じ結果が得られるようにします。
select p1.product_reg_no,
p1.product_no product_no_1,
p2.product_no product_no_2,
p1.start_date start_date_1,
nvl(p2.return_date,p2.end_date) return_or_end_date_2
from products p1, products p2
where p1.start_date-1 = nvl(p2.return_date,p2.end_date)
SQLフィドル2
今、あなたは違いが1日であると言います。start_dateはnvl(return_date、end_date)より1日高いと自動的に想定しました。また、日付は常に真夜中だと思いました。しかし、それらもすべて除外するには、truncを使用して、双方向に進むことができます。
select p1.product_reg_no,
p1.product_no product_no_1,
p2.product_no product_no_2,
p1.start_date start_date_1,
nvl(p2.return_date,p2.end_date) return_or_end_date_2
from products p1, products p2
where trunc(p1.start_date)-1 = trunc(nvl(p2.return_date,p2.end_date))
or trunc(p1.start_date)+1 = trunc(nvl(p2.return_date,p2.end_date))
SQLフィドル3
日付(タイムスタンプではない)は加算と減算によって計算できるため、これはすべて機能します。
編集:あなたのコメントに続いて、return_date or
end_dateを比較し、同じ日付も必要です:
select p1.product_reg_no,
p1.product_no product_no_1,
p2.product_no product_no_2,
p1.start_date start_date_1,
p2.return_date return_date_2,
p2.end_date end_date_2
from products p1, products p2
where trunc(p1.start_date) = trunc(p2.return_date)
or trunc(p1.start_date)-1 = trunc(p2.return_date)
or trunc(p1.start_date)+1 = trunc(p2.return_date)
or trunc(p1.start_date) = trunc(p2.end_date)
or trunc(p1.start_date)-1 = trunc(p2.end_date)
or trunc(p1.start_date)+1 = trunc(p2.end_date)
SQLフィドル4