Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 重叠记录_Sql_Database_Oracle10g - Fatal编程技术网

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
   )