首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL连接通过比较度量或循环与游标?

SQL连接通过比较度量或循环与游标?
EN

Stack Overflow用户
提问于 2018-11-21 16:03:22
回答 1查看 50关注 0票数 0

为了验证是否按时完成交付,我需要根据所需数量(SchLin)和所需数量(ReqQty)和交付数量(DlvQty)之间的比较,将交付文档与PO计划行(DlvQty)相匹配。

传递文档引用PO和POItm,但不引用SchLin。一旦将交付文档分配到调度行,我就可以计算交付达美(DlvDelta)与需求(ReqDate)相比,它早交付或晚交付的天数。

这两个基表的例子如下:

排程线

代码语言:javascript
复制
PO  POItm   SchLin  ReqDate ReqQty
123 1       1       10/11   20
123 1       2       30/11   30
124 2       1       15/12   10
124 2       2       24/12   15

送货文件

代码语言:javascript
复制
Doc Item    PO  POItm   DlvDate DlvQty
810 1       123 1       29/10   12
816 1       123 1       02/11   07
823 1       123 1       04/11   13
828 1       123 1       06/11   08
856 1       123 1       10/11   05
873 1       123 1       14/11   09
902 1       124 2       27/11   05
908 1       124 2       30/11   07
911 1       124 2       08/12   08
923 1       124 2       27/12   09

重要事项:时间表线和交货应该有相同的PO和POItm。链接的另一个逻辑是将DlvQty和到(或超过) ReqQty。然后,这些交货将与时间表联系起来。随后的交付将用于下列附表行。送货时刻表只能与一个时刻表相匹配。

在比较了ReqQty和DlvQty之后,分配的结果应该是:

结果

代码语言:javascript
复制
Doc Item    PO  POItm   Schlin  ReqDate DlvDate DlvDelta
810 1       123 1       1       10/11   29/10   -11
816 1       123 1       1       10/11   02/11   -08
823 1       123 1       1       10/11   04/11   -06
828 1       123 1       2       30/11   06/11   -24
856 1       123 1       2       30/11   10/11   -20
873 1       123 1       2       30/11   14/11   -16
902 1       124 2       1       15/12   27/11   -18
908 1       124 2       1       15/12   30/11   -15
911 1       124 2       2       24/12   08/12   -16
923 1       124 2       2       24/12   27/12   +03

到目前为止,我已经使用游标循环完成了这个任务,但是性能相当缓慢。

在SQL (脚本)中是否有另一种方法,通过比较措施来实现相同的结果,从而使用例如联接?

致以敬意,

埃里克

EN

回答 1

Stack Overflow用户

发布于 2018-11-21 21:10:01

如果可以表示将传递与计划行匹配的规则,则可以在单个查询中生成所需的结果。而且,是的,我保证它将比在游标上的循环中执行相同的逻辑更快(也更简单)。

我不能重现你的确切结果,因为我不太明白这两个表是如何联系起来的。希望从下面的代码中,您能够通过调整联接标准来找出它。

我没有你的数据库。我的代码使用SQLite,它有自己特有的日期函数。你将不得不替代你的系统提供的。在任何情况下,我都不能推荐用于日期的5字符字符串。如果您有日期时间类型,则使用日期时间类型,并包括4位数的年份。除此之外,圣诞节和新年之间还有多少天?

代码语言:javascript
复制
create table S (
    PO int not NULL,
    POItm int not NULL,
    SchLin int not NULL,
    ReqDate char not NULL, 
    ReqQty int not NULL,
    primary key (PO, POItm, SchLin)
    );

insert into S values
(123, 1,       1,       '10/11',   20 ), 
(123, 1,       2,       '30/11',   30 ), 
(124, 2,       1,       '15/12',   10 ), 
(124, 2,       2,       '24/12',   15 );

create table D (
       Doc int not NULL, 
       Item int not NULL, 
       PO int not NULL, 
       POItm int not NULL, 
       DlvDate char not NULL, 
       DlvQty int not NULL,
       primary key (Doc, Item)
); 

insert into D values 
(810, 1,       123, 1,       '29/10',   12 ), 
(816, 1,       123, 1,       '02/11',   07 ), 
(823, 1,       123, 1,       '04/11',   13 ), 
(828, 1,       123, 1,       '06/11',   08 ), 
(856, 1,       123, 1,       '10/11',   05 ), 
(873, 1,       123, 1,       '14/11',   09 ), 
(902, 1,       124, 2,       '27/11',   05 ), 
(908, 1,       124, 2,       '30/11',   07 ), 
(911, 1,       124, 2,       '08/12',   08 ), 
(923, 1,       124, 2,       '27/12',   09 );

select D.Doc, D.Item, D.PO, S.SchLin, S.ReqDate, D.DlvDate
, cast(
    julianday('2018-' || substr(DlvDate, 4,2) || '-' || substr(DlvDate, 1,2))
  - julianday('2018-' || substr(ReqDate, 4,2) || '-' || substr(ReqDate, 1,2))
  as int) as DlvDelta
from S join D on S.PO = D.PO and S.POItm = D.POItm
;

结果:

代码语言:javascript
复制
Doc         Item        PO          SchLin      ReqDate     DlvDate     DlvDelta  
----------  ----------  ----------  ----------  ----------  ----------  ----------
810         1           123         1           10/11       29/10       -12       
810         1           123         2           30/11       29/10       -32       
816         1           123         1           10/11       02/11       -8        
816         1           123         2           30/11       02/11       -28       
823         1           123         1           10/11       04/11       -6        
823         1           123         2           30/11       04/11       -26       
828         1           123         1           10/11       06/11       -4        
828         1           123         2           30/11       06/11       -24       
856         1           123         1           10/11       10/11       0         
856         1           123         2           30/11       10/11       -20       
873         1           123         1           10/11       14/11       4         
873         1           123         2           30/11       14/11       -16       
902         1           124         1           15/12       27/11       -18       
902         1           124         2           24/12       27/11       -27       
908         1           124         1           15/12       30/11       -15       
908         1           124         2           24/12       30/11       -24       
911         1           124         1           15/12       08/12       -7        
911         1           124         2           24/12       08/12       -16       
923         1           124         1           15/12       27/12       12        
923         1           124         2           24/12       27/12       3         
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53416026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档