sql连接表,未提供完美的结果
让我解释一下我需要什么,我有两个表名为A和B。B是A的子表 以下是模式:sql连接表,未提供完美的结果,sql,postgresql,tsql,greatest-n-per-group,Sql,Postgresql,Tsql,Greatest N Per Group,让我解释一下我需要什么,我有两个表名为A和B。B是A的子表 以下是模式: ------------------------ Table B: itemId version qty AId 44 1 1 200 44 1 2 201 44 2 2 200 ------------------------ Table A: id tId 200 100 201 100 ------------------------
------------------------
Table B:
itemId version qty AId
44 1 1 200
44 1 2 201
44 2 2 200
------------------------
Table A:
id tId
200 100
201 100
------------------------
这里是我需要的:我需要的所有最新版本数量的总和,有相同的tId
我的问题是:
select sum(qty) as sum from B
left join A on A.id=B.AId
where itemId=44 and tId=100 and
version=(select max(version) from B where itemId=44 and tId=100)
当一个项目的版本2和版本1被忽略时,结果会出错
谢谢
编辑:
我需要的是:
itemId version qty AId
44 2 2 200
44 1 2 201
总和(数量)的结果必须是4,因为它们具有相同的tId,并且在每个辅助中具有最大版本
SELECT B.*
FROM B
INNER JOIN
(SELECT Aid,MAX(version) AS version FROM B WHERE itemId=44 GROUP BY AId) AS B1
ON B.Aid=B1.Aid
AND B.version=B1.version
INNER JOIN
(SELECT * FROM A WHERE tId=100) AS A
ON A.id=B.Aid
Order BY B.aid
数量总和
SELECT SUM(B.qty)
FROM B
INNER JOIN
(SELECT Aid,MAX(version) AS version FROM B WHERE itemId=44 GROUP BY AId) AS B1
ON B.Aid=B1.Aid AND B.version=B1.version
INNER JOIN
(SELECT * FROM A WHERE tId=100) AS A
ON A.id=B.Aid
GROUP BY A.tid
输出
itemid version qty aid
44 2 2 200
44 1 2 201
演示
试试这个
DECLARE @TA Table (id int,tid int)
DECLARE @TB Table (itemid int, version int,qty int,AID int)
INSERT INTO @TA
SELECT 200, 100
UNION ALL
SELECT 201, 100
INSERT INTO @TB
SELECT 44,1,1,201
UNION ALL
SELECT 44,1,2,200
UNION ALL
SELECT 44,2,3,200
UNION ALL
SELECT 44,2,5,201
DECLARE @tid int
SET @tid = 100
SELECT XB.* FROM @Tb XB INNER JOIN
(SELECT Version,Max(AID) Aid FROM @TA A INNER JOIN @TB B ON A.id = B.AID AND tid = @tid Group By Version) X
ON X.version = XB.version and XB.AID = X.Aid
工作溶液
select b.* from B as b
inner join
(select AID,itemId,Max(version) as mVersion from B
group by AID,itemID) d
on b.AID = d.AID and b.itemID = d.itemID and b.Version = d.mVersion
inner join A as a
on B.AID = a.id
where b.itemID = 44 --apply if you need
结果
itemid version qty aid
44 2 2 200
44 1 2 201
itemid sum
44 4
这将给你的结果作为你的数量总和
select itemID,sum(qty) from (
select b.* from B as b
inner join
(select AID,itemId,Max(version) as mVersion from B
group by AID,itemID) d
on b.AID = d.AID and b.itemID = d.itemID and b.Version = d.mVersion
inner join A as a
on B.AID = a.id
where b.itemID = 44 --apply if you need
) e group by itemID
结果
itemid version qty aid
44 2 2 200
44 1 2 201
itemid sum
44 4
我认为这个问题有助于你解决问题
SELECT itemId, version, qty , AId FROM (
SELECT itemId, version, qty , AId FROM b
LEFT JOIN a ON (b.aid = a.id)
) temp
WHERE version = (SELECT MAX(version) FROM b WHERE b.aid = temp.aid)
and temp.tid = 100 and temp.itemId = 44
使用窗口功能
select itemid, version, qty, aid
from (
select *, max(version) over (partition by AId) as latestVersion
from B
) as B
where version = latestVersion
总结
select tId, SUM(qty) AS qty_sum
from (
select *, max(version) over (partition by AId) as latestVersion
from B
) as B
join A on B.AId = A.id
where version = latestVersion
group by tId
Postgres中最有效的解决方案问题通常是使用(专有)操作符
distinct on()
因此,要获取每个a.id的最新版本,您可以使用:
select distinct on (a.id) b.*
from a
join b on a.id = b.aid
order by a.id, b.version desc;
上述申报表:
itemid |版本|数量|辅助
-------+---------+-----+----
44 | 2 | 2 | 200
44 | 1 | 2 | 201
然后可以对结果求和:
select sum(qty)
from (
select distinct on (a.id) b.qty
from a
join b on a.id = b.aid
order by a.id, b.version desc
) t;
请注意,通常派生表中的orderby
是无用的,但在这种情况下需要它,因为否则distinct on()
将不起作用
在线示例:请给出您需要的输出示例require@RaunakThomas,谢谢你的评论。我在编辑中添加它part@Khir请在标记中添加您正在使用的dbms。我建议为您需要答案的特定SQL添加一个标记。@NishantGupta,我添加了它