Sql 联接表的最后一条记录

Sql 联接表的最后一条记录,sql,Sql,我正在寻找正确的SQL代码来连接2个表,并只显示details表的最后一条记录 我有一个数据库和两个表 Deals DealID Dealname DealDetails DealComments dcID DealID CommentTime CommentPerson Comment 每笔交易都有多条评论,但我想创建一个视图,显示所有交易,只显示每笔交易的最后一条评论(由CommentTime字段确定) 编辑:我没有仔细阅读最初的问题,也

我正在寻找正确的SQL代码来连接2个表,并只显示details表的最后一条记录

我有一个数据库和两个表

Deals 
   DealID
   Dealname
   DealDetails

DealComments
   dcID
   DealID
   CommentTime
   CommentPerson
   Comment
每笔交易都有多条评论,但我想创建一个视图,显示所有交易,只显示每笔交易的最后一条评论(由CommentTime字段确定)

编辑:我没有仔细阅读最初的问题,也没有注意到视图中需要所有交易行。以下是我修改后的答案:

select a.dealid
, a.dealname
, a.dealdetails
, b.dcid
, b.commenttime
, b.commentperson
, b.comment
from deals a left outer join (select x.dcid
, x.dealid
, x.commenttime
, x.commentperson
, x.comment
from dealcomments x
where x.commenttime = (select max(x1.commenttime)
                       from dealcomments x1
                       where x1.dealid = x.dealid)) b
on (a.dealid = b.dealid)
试试这个

SELECT D.*,DC1.Comment 
FROM Deals AS D
   INNER JOIN DealComments AS DC1
        ON D.DealId = DC1.DealID
    INNER JOIN 
    (
        SELECT 
            DealID,
            MAX(CommentTime) AS CommentTime
        FROM DealComments AS DC2
        GROUP BY DealID
    ) AS DC2
        ON DC2.DealId = DC.DealId
            AND DC2.CommentTime = DC1.CommentTime

不是很优雅,但在Oracle中工作:

select dealid,
       dealname,
       dealdetails,
       comment,
from
(
  select a.dealid,
         a.dealname,
         a.dealdetails,
         b.commenttime,
         b.comment,
         max(commenttime) over (partition by a.dealid) as maxCommentTime
  from deals a inner join dealcomments b on b.dealid = a.dealid
)
where comment = maxCommentTime
试试这个:

CREATE VIEW DealsWithLastComment
AS
   SELECT
       D.*, DC.*
   FROM
       Deals D INNER JOIN DealComments DC
       ON D.DealID = DC.DealID
       GROUP BY D.DealID, DC.CommentTime
       HAVING DC.CommentTime = MAX(DC.CommentTime)

强制性无子查询无处应答:

select d.*
       , dc.*
from   Deals d
       left outer join DealComments dc 
       on d.DealID = dc.DealID
       left outer join DealComments dc1 
       on d.DealID = dc1.DealID 
   and 
       dc1.CommentTime > dc.CommentTime
where  dc1.CommentTime is null
当某个特定
DealID
CommentTime
大于任何给定的注释时间时,显示
DealComments
DealComments
中的所有内容

编辑:正如亚历克斯·库兹涅佐夫(Alex Kuznetsov)在评论中敏锐地指出的那样:OP要求显示所有交易——无论交易是否有评论。因此,我将第一个
连接
内部
更改为
左侧外部

这个查询如何

select * from Deals 
left join DealComments on Deals.DealID = DealComments.DealID and DealComments.CommentTime = (SELECT CommentTime  FROM DealComments WHERE DealComments.DealID = Deals.DealID ORDER BY CommentTime DESC limit 1)

是的,答案和约翰一样,但我在同一时间写的,他就在我之前几秒钟发了出来。对不起!但这真的值得投反对票吗?!同样,这也不完全正确:要求选择“所有交易”,但您的内部连接会消除交易,而不会消耗评论时间,但很漂亮@天蝎座:谢谢!耗时的答案通常不会引起太多注意:)不完全正确:要求选择“所有交易”,但您的内部连接会消除交易而不添加注释Hanks Alex,您完全正确。我已经更新了答案。这非常有效,但是它只返回有评论的交易。我也希望看到那些没有价值的交易comments@Khalid-我编辑了我的答案,新的SQL应该返回所有交易行。如果某笔交易有两个或更多的最后评论,且时间完全相同,您希望如何?为什么您将其描述为“不太优雅”?
select d.*
       , dc.*
from   Deals d
       left outer join DealComments dc 
       on d.DealID = dc.DealID
       left outer join DealComments dc1 
       on d.DealID = dc1.DealID 
   and 
       dc1.CommentTime > dc.CommentTime
where  dc1.CommentTime is null
select * from Deals 
left join DealComments on Deals.DealID = DealComments.DealID and DealComments.CommentTime = (SELECT CommentTime  FROM DealComments WHERE DealComments.DealID = Deals.DealID ORDER BY CommentTime DESC limit 1)