【问题标题】:How to compose two SQLITE queries with different conditions to return a pair of rows如何组合两个不同条件的 SQLITE 查询以返回一对行
【发布时间】:2016-09-22 00:45:53
【问题描述】:

我有一些送货数据,比如说英国超市。我感兴趣的数据由两个select 查询组成,如下所示:

select t2.COMNAME, t0.DELDATE, t1.DELSERN, t1.DELEACTVOL, t3.PRODNAME, t3.PRODEANC from TDELIVER t0 inner join TDELENTR t1 on (t1.DELSERN=t0.DELSERN) 
inner join TCOMPANY t2 on (t2.COMSERNO=t0.COMSERNO)
inner join TPRODUCT t3 on (t1.PRODSERN=t3.PRODSERN) 
where t1.DELEACTVOL < 0

DELEACTVOL否定的情况下产生结果,类似这样,但包含更多条目和真实数据:

select t2.COMNAME, t0.DELDATE, t1.DELSERN, t1.DELEACTVOL, t3.PRODNAME, t3.PRODEANC from TDELIVER t0 inner join TDELENTR t1 on (t1.DELSERN=t0.DELSERN) 
inner join TCOMPANY t2 on (t2.COMSERNO=t0.COMSERNO)
inner join TPRODUCT t3 on (t1.PRODSERN=t3.PRODSERN)

DELEACTVOL 负或正的情况下产生所有结果,如下所示:

如您所见,这两个查询是相同的,除了一个过滤掉(大部分)positive volume条目。每个交付都有一个唯一的DELSERN

我需要一个查询,它会给我每个DELSERN(每次交付),例如DELSERN XXXX.......89,于 5 月 24 日交付给 Tesco,其中包含一些产品,例如 Product A,带有 @ 987654335@ 如果在同一交付中有该产品的 positive delivery volume。样本数据中XXXX.......37不应返回。

我觉得我应该使用WHERE INJOIN,但我不知道。

我试过了:

select t2.COMNAME, t0.DELDATE, t1.DELEACTVOL, t3.PRODNAME, t3.PRODEANC from TDELIVER t0 inner join TDELENTR t1 on (t1.DELSERN=t0.DELSERN) 
inner join TCOMPANY t2 on (t2.COMSERNO=t0.COMSERNO)
inner join TPRODUCT t3 on (t1.PRODSERN=t3.PRODSERN) 
where t1.DELEACTVOL < 0
and EXISTS(select p2.COMNAME, p0.DELDATE, p1.DELEACTVOL, p3.PRODNAME, p3.PRODEANC from TDELIVER p0 inner join TDELENTR p1 on (p1.DELSERN=p0.DELSERN) 
inner join TCOMPANY p2 on (p2.COMSERNO=p0.COMSERNO)
inner join TPRODUCT p3 on (p1.PRODSERN=p3.PRODSERN) 
where p1.DELEACTVOL > 0 and t1.DELSERN = p1.DELSERN) 
ORDER by t1.DELEACTVOL

...希望and t1.DELSERN = p1.DELSERN 部分可以解决问题,但这会返回与第一个查询相同的结果。我猜是因为每次交付产品 A 的负数量至少会有一些正产品?我可能也需要考虑PRODNAME

任何帮助都会很棒。

【问题讨论】:

  • 对于给定的 delesern 是否可以有不止一对这样的对?

标签: sql sqlite join where-in


【解决方案1】:

您可以join 对除deleactvol 之外的所有列进行查询并选择所需的列。

select p1.delsern,p1.deleactvol,p2.deleactvol
from (
select t2.COMNAME, t0.DELDATE,t1.DELSERN, t1.DELEACTVOL, t3.PRODNAME, t3.PRODEANC 
from TDELIVER t0 
inner join TDELENTR t1 on (t1.DELSERN=t0.DELSERN) 
inner join TCOMPANY t2 on (t2.COMSERNO=t0.COMSERNO)
inner join TPRODUCT t3 on (t1.PRODSERN=t3.PRODSERN) 
where t1.DELEACTVOL < 0) p1
join (select t2.COMNAME, t0.DELDATE,t1.DELSERN, t1.DELEACTVOL, t3.PRODNAME, t3.PRODEANC 
      from TDELIVER t0 
      inner join TDELENTR t1 on (t1.DELSERN=t0.DELSERN) 
      inner join TCOMPANY t2 on (t2.COMSERNO=t0.COMSERNO)
      inner join TPRODUCT t3 on (t1.PRODSERN=t3.PRODSERN) 
      where t1.DELEACTVOL > 0) p2
on p1.DELSERN = p2.DELSERN and p1.COMNAME = p2.COMNAME 
and p1.DELDATE = p2.DELDATE and p1.PRODNAME = p2.PRODNAME and p1.PRODEANC = p2.PRODEANC 

如果每个delsern只能有一个正负deleactvol,你可以这样做

select t2.COMNAME, t0.DELDATE, t1.DELSERN, t3.PRODNAME, t3.PRODEANC 
from TDELIVER t0 
inner join TDELENTR t1 on (t1.DELSERN=t0.DELSERN) 
inner join TCOMPANY t2 on (t2.COMSERNO=t0.COMSERNO)
inner join TPRODUCT t3 on (t1.PRODSERN=t3.PRODSERN) 
group by t2.COMNAME, t0.DELDATE, t1.DELSERN, t3.PRODNAME, t3.PRODEANC
having sum(case when t1.DELEACTVOL < 0 then -1 when t1.DELEACTVOL > 0 then 1 end) = 0

【讨论】:

  • 谢谢!完美运行
猜你喜欢
  • 2020-12-18
  • 1970-01-01
  • 1970-01-01
  • 2016-07-22
  • 2020-03-22
  • 1970-01-01
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多