Sql Oracle查找在若干天内是否存在相应的记录

Sql Oracle查找在若干天内是否存在相应的记录,sql,oracle,date-arithmetic,Sql,Oracle,Date Arithmetic,我正试图从彼此之间减去迄今为止的数据 问题是,我必须创建一个查询来显示在订购后30天内未发货的订单 以下是我的尝试: select orderno from orders where 30> (select datediff(dd,s.ship_date,o.odate ) from o.orders,s.shipment); 我得到的错误是 第1行错误: ORA-00942:表或视图不存在 以下是两个表格: SQL> desc orders Name

我正试图从彼此之间减去迄今为止的数据

问题是,我必须创建一个查询来显示在订购后30天内未发货的订单

以下是我的尝试:

select orderno 
from orders 
where 30> (select datediff(dd,s.ship_date,o.odate ) 
           from o.orders,s.shipment);
我得到的错误是

第1行错误: ORA-00942:表或视图不存在

以下是两个表格:

SQL> desc orders

Name                                      Null?    Type
----------------------------------------- -------- ----------------------------

ORDERNO                                   NOT NULL NUMBER(3)
ODATE                                     NOT NULL DATE
CUSTNO                                             NUMBER(3)
ORD_AMT                                            NUMBER(5)

SQL> desc shipment
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------

ORDERNO                                   NOT NULL NUMBER(3)
WAREHOUSENO                               NOT NULL VARCHAR2(3)
SHIP_DATE                                          DATE

您的语法错误,您正试图隐式执行交叉联接。我认为您需要的是一个内部联接,我假设它将返回一行,如果它返回多行,则使用>ALL like:

select orderno 
from orders 
where 30> (select s.ship_date - o.odate 
           from orders o INNER JOIN shipment s
           ON o.orderNo = s.orderNo);

您的语法错误,您正试图隐式执行交叉联接。我认为您需要的是一个内部联接,我假设它将返回一行,如果它返回多行,则使用>ALL like:

select orderno 
from orders 
where 30> (select s.ship_date - o.odate 
           from orders o INNER JOIN shipment s
           ON o.orderNo = s.orderNo);

你会想要一些大致如下的东西:

select ...
from   orders o
where  not exists (
         select null
         from   shipments s
         where  s.orderno   = o.orderno
         and    s.ship_date <= (o.odate + 30))
如果您只想以天为单位求差,则日期算术非常简单,因为您可以将天作为整数进行加减。如果是月、季或年,您可能希望使用Add_months


此外,在上面的查询中,最好说发货日期您希望得到以下内容:

select ...
from   orders o
where  not exists (
         select null
         from   shipments s
         where  s.orderno   = o.orderno
         and    s.ship_date <= (o.odate + 30))
如果您只想以天为单位求差,则日期算术非常简单,因为您可以将天作为整数进行加减。如果是月、季或年,您可能希望使用Add_months


另外,在上面的查询中最好说发货日期这里有一种方法,使用Oracle语法:

select o.orderno
from orders o
where 30 > (select o.date - s.ship_date
            from shipment s
            where s.orderno = o.orderno
           );
注意子查询中的correlation子句,但是每个表只提到一次

您遇到的问题是订单可能会多次发货,这将在查询中生成错误,因为子查询将返回多行。一种解决方案是聚合。您需要确定问题是整个订单未在30天内发货,还是订单的任何部分未在30天内发货。后者将使用MIN:


以下是一种使用Oracle语法的方法:

select o.orderno
from orders o
where 30 > (select o.date - s.ship_date
            from shipment s
            where s.orderno = o.orderno
           );
注意子查询中的correlation子句,但是每个表只提到一次

您遇到的问题是订单可能会多次发货,这将在查询中生成错误,因为子查询将返回多行。一种解决方案是聚合。您需要确定问题是整个订单未在30天内发货,还是订单的任何部分未在30天内发货。后者将使用MIN:


您正在对Oracle数据库使用SQL Server语法。除了SQL中的逻辑错误外,您的代码根本无法在Oracle上运行。您正在Oracle数据库中使用SQL Server语法。除了SQL中的逻辑错误之外,您的代码根本无法在Oracle上运行。我考虑了整个订单问题,但我不认为所描述的数据模型包含这一点。如果订单的一部分在30天内发货,而另一部分根本没有发货,那么在这个数据模型中就不会有关于这一点的信息,而且所有的查询看起来都好像订单已经完成一样。@davidridge。如果每个订单有多个发货日期,则使用带有>的子查询将生成错误。确实如此。这显然是一个简单的例子,其中可能只预期一批货。不过,如果查询对这类内容具有健壮性,那就最好了。我考虑了整个订单问题,但我认为所描述的数据模型并不包含这一点。如果订单的一部分在30天内发货,而另一部分根本没有发货,那么在这个数据模型中就不会有关于这一点的信息,而且所有的查询看起来都好像订单已经完成一样。@davidridge。如果每个订单有多个发货日期,则使用带有>的子查询将生成错误。确实如此。这显然是一个简单的例子,其中可能只预期一批货。不过,如果查询对这些东西很健壮,那就最好了。我认为目前的查询仍然不起作用,因为主查询和子查询之间没有相关性。我认为它会返回太多行错误,因为子查询返回的是订单和发货之间联接的未过滤投影。是的,应该是这样。。我们不应该加入,而是使用相关的查询,比如:从订单o中选择o.orderno,其中30>从装运s中选择o.date-s.ship\U日期,其中s.orderno=o.orderno;我只是试图纠正OP的连接或语法。我认为目前的查询仍然不起作用,因为主查询和子查询之间没有关联。我认为它会返回太多行错误,因为子查询返回的是订单和发货之间联接的未过滤投影。是的,应该是这样。。我们不应该加入,而是使用相关的查询,比如:从订单o中选择o.orderno,其中30>从装运s中选择o.date-s.ship\U日期,其中s.orderno=o.orderno;我只是试着用t来纠正 OP的联接或语法的erms。。