Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql连接表,未提供完美的结果_Sql_Postgresql_Tsql_Greatest N Per Group - Fatal编程技术网

sql连接表,未提供完美的结果

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 ------------------------

让我解释一下我需要什么,我有两个表名为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
------------------------
这里是我需要的:我需要的所有最新版本数量的总和,有相同的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,我添加了它