Sql 重叠记录
我有一个名为Sql 重叠记录,sql,database,oracle10g,Sql,Database,Oracle10g,我有一个名为PRODUCTS的表,每个PRODUCT\u NO\u REGISTRATION\u NO只允许使用一次,即产品开始日期和返回日期不应冲突 我们退回产品,退货日期在实际退货日期中输入,如果实际退货日期为空,我们将结束日期作为退货日期 你可以看到记录 例如,产品号注册号冲突,因为HP 2014在2001年6月18日返回,而HP 2012同一产品号注册号在2001年6月18日分配。 如何使用sql确定记录是否重叠 更新1 表PRODUCTS中进行了修改,包括PRODUCT\u EXTEN
PRODUCTS
的表,每个PRODUCT\u NO\u REGISTRATION\u NO
只允许使用一次,即产品开始日期和返回日期不应冲突
我们退回产品,退货日期在实际退货日期
中输入,如果实际退货日期
为空,我们将结束日期
作为退货日期
你可以看到记录
例如,产品号注册号冲突,因为HP 2014在2001年6月18日返回,而HP 2012同一产品号注册号在2001年6月18日分配。
如何使用sql确定记录是否重叠
更新1
表PRODUCTS
中进行了修改,包括PRODUCT\u EXTENSION\u NO
。
产品号、产品号注册号和产品号扩展号的组合成为唯一的行(复合主键)
规则如下
每个产品\u NO\u REGISTRATION\u NO
仅允许使用一次,即产品开始日期和退货日期不应冲突
我们退回产品,退货日期在实际退货日期
中输入,如果实际退货日期
为空,我们将结束日期
作为退货日期
产品编号
有扩展,因此结束日期
被扩展
例如,如果你看到记录
PRODUCT\u NO
-ORP76
带PRODUCT\u EXTENSION\u NO
-1
与PRODUCT\u NO
冲突
如何使用sql确定记录是否重叠,但允许扩展PRODUCT\u NO
。i、 e.PRODUCT\u NO
ORP76
带有扩展名0
和扩展名1基本上是扩展的。假设PRODUCT\u NO
是唯一的,您可以自联接products表并检查:
.假设产品编号
是唯一的,您可以自行加入产品表并检查:
.可能存在产品编号不唯一的情况。Thanks@Polappan必须有一种方法将记录从匹配本身中排除。你可以使用rowid来达到这个效果……我会在我知道它是如何工作的时候对它进行彻底的测试,然后再给你回复。非常感谢Nikola。我已经修改了表结构并添加了上面的规则作为更新1。如何获取重叠或冲突的记录?谢谢。@Polapan很抱歉,我不了解PRODUCT\u NO\PRODUCT\u EXTENSION\u NO
的业务。结束日期如何延长?什么意思是允许扩展产品编号
?可能存在产品编号不唯一的情况。Thanks@Polappan必须有一种方法将记录从匹配本身中排除。你可以使用rowid来达到这个效果……我会在我知道它是如何工作的时候对它进行彻底的测试,然后再给你回复。非常感谢Nikola。我已经修改了表结构并添加了上面的规则作为更新1。如何获取重叠或冲突的记录?谢谢。@Polapan很抱歉,我不了解PRODUCT\u NO\PRODUCT\u EXTENSION\u NO
的业务。结束日期如何延长?什么意思是允许扩展产品号?
select *
from PRODUCTS
inner join products products_test
on products.PRODUCT_NO_REGISTRATION_NO
= products_test.PRODUCT_NO_REGISTRATION_NO
and products.start_date
<= nvl (products_test.ACTUAL_RETURN_DATE, products_test.end_date)
and nvl (products.ACTUAL_RETURN_DATE, products.end_date)
>= products_test.start_date
and products.product_no
<> products_test.product_no
select *
from PRODUCTS
inner join products products_test
on products.PRODUCT_NO_REGISTRATION_NO
= products_test.PRODUCT_NO_REGISTRATION_NO
and products.start_date
<= nvl (products_test.ACTUAL_RETURN_DATE, products_test.end_date)
and nvl (products.ACTUAL_RETURN_DATE, products.end_date)
>= products_test.start_date
and products.rowid
<> products_test.rowid
with extended as
(
select PRODUCT_NO,
PRODUCT_NO_REGISTRATION_NO,
min (START_DATE) as start_date,
max (nvl (ACTUAL_RETURN_DATE, END_DATE)) as end_date
from products
group by PRODUCT_NO, PRODUCT_NO_REGISTRATION_NO
)
select e1.PRODUCT_NO_REGISTRATION_NO,
e1.PRODUCT_NO,
e1.start_date,
e1.end_date,
e2.PRODUCT_NO "PRODUCT_NO - CLASH",
e2.start_date "START_DATE - CLASH",
e2.end_date "END_DATE - CLASH"
from extended e1
inner join extended e2
on e1.PRODUCT_NO_REGISTRATION_NO
= e2.PRODUCT_NO_REGISTRATION_NO
and e1.start_date <= e2.end_date
and e1.end_date >= e2.start_date
-- Remove self-references
and not
(
e1.PRODUCT_NO = e2.PRODUCT_NO
and e1.PRODUCT_NO_REGISTRATION_NO
= e2.PRODUCT_NO_REGISTRATION_NO
)