如何将两个具有不同条件的 SQLITE 查询组合成 return 一对行
How to compose two SQLITE queries with different conditions to return a pair of rows
我有一些送货数据,比方说英国超市的送货数据。我感兴趣的数据由两个 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
是负或正,像这样:
如您所见,除了一个过滤掉(大部分)正量 条目之外,这两个查询是相同的。每次交付都有一个唯一的 DELSERN
。
我需要一个查询,它会给我每个 DELSERN
(每次交付),例如 DELSERN
XXXX.......89
,于 5 月 24 日交付给 Tesco,其中包含一些产品,说 Product A
,negative delivery volume
只有 如果在同一次交付中该产品有 positive delivery volume
。在示例数据中 XXXX.......37
不应返回。
我觉得我应该使用 WHERE IN
或 JOIN
,但我不知道。
我试过:
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
部分可以解决问题,但这 returns 与第一个查询相同。我猜是因为产品 A 的每次交付量为负时,至少会有一些正产品?我可能也需要考虑 PRODNAME
?
任何帮助都会很棒。
您可以 join
所有列的查询,除了 deleactvol
和 select 所需的列。
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
我有一些送货数据,比方说英国超市的送货数据。我感兴趣的数据由两个 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
是负或正,像这样:
如您所见,除了一个过滤掉(大部分)正量 条目之外,这两个查询是相同的。每次交付都有一个唯一的 DELSERN
。
我需要一个查询,它会给我每个 DELSERN
(每次交付),例如 DELSERN
XXXX.......89
,于 5 月 24 日交付给 Tesco,其中包含一些产品,说 Product A
,negative delivery volume
只有 如果在同一次交付中该产品有 positive delivery volume
。在示例数据中 XXXX.......37
不应返回。
我觉得我应该使用 WHERE IN
或 JOIN
,但我不知道。
我试过:
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
部分可以解决问题,但这 returns 与第一个查询相同。我猜是因为产品 A 的每次交付量为负时,至少会有一些正产品?我可能也需要考虑 PRODNAME
?
任何帮助都会很棒。
您可以 join
所有列的查询,除了 deleactvol
和 select 所需的列。
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