簡體   English   中英

SQL查詢通過聯接獲取與最大值對應的行

[英]SQL query to get row corresponding to max value with join

這是2張桌子-

Table A

id | col1 | col2 
----------------
 1 | val1 | val2
 2 | val3 | val4 


Table B

id | version | col3 | col4
--------------------------
 1 |    1    | val5 | val6
 1 |    2    | val7 | val8

我想獲取A.col1,A.col2,B.col3,B.col4的值,其中A.id = B.id和B.version是最大版本。 因此,我想要一個結果集-

id | version | col1 | col2 | col3 | col4 
----------------------------------------
 1 |   2     | val1 | val2 | val7 | val8

可以使用哪些SQL查詢來實現此結果?

謝謝!

select a.id, b2.version, a.col1, a.col2, b.col3, b.col4
from a
join b on a.id=b.id
join (select id, max(version) version from b group by id) b2 on b2.id=b.id and b2.version=b.version

與前面的答案類似,但是實際上您可以只使用一個聯接而不是兩個聯接:

准備測試數據:

Select * INTO #TableA 
from (
    Select 1 as ID , 'val1' as col1, 'val2' as col2
    UNION Select 2, 'val3', 'val4'
) A

Select * INTO #TableB 
from (
    Select 1 as id, 1 as version, 'val5' as col3, 'val6' as col4
    UNION Select 1, 2, 'val7', 'val8'
) B

獲得結果:

Select A.col1, A.col2, B.col3, B.col4
from #TableA A
JOIN (
    Select ID, max(version) as version, max(col3) as col3, max(col4) as col4 from #TableB Group By ID
) B ON A.ID = B.ID

嘗試這個:

SELECT *
FROM A
INNER JOIN ( 
   SELECT * FROM B 
   INNER JOIN (
       SELECT ID, MAX(Version) 
       FROM B 
       GROUP BY ID
   ) XXX ON (B.ID = XXX.ID)
) YYY ON (A.ID = YYY.ID)

在SQL Fiddle上進行了嘗試:

select tableA.id, version, col1, col2, col3, col4 from tableA
join tableB on tableA.id = tableB.id
where version = (select max(version) from tableB where tableB.id = tableA.id);

這將為您提供一個結果集,其中包含表B中存在的表A中每個id的最大版本和對應的值。

SQLFiddle

根據docs Group-wise Maximum of a Certain Column您可以將查詢寫為

select a.*,
b.`col3`,
b.`col4`,
b.version
from a
join b on(a.id = b.id)
left join b b2 on(b.id = b2.id and b.version < b2.version)
where b2.id is null

Fiddle Demo

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM