SQL,从两个表中选择而不获取所有行

4

我有两个表:COMMENTCOMMENTHISTORY

现在我需要从这两个表中选择单元格,如下所示:

SELECT c.Id, c.Userid, ch.Text, ch.Timestamp
FROM COMMENT c, COMMENTHISTORY ch
WHERE ch.CommentId = c.Id
ORDER BY ch.Timestamp DESC

功能正常。唯一的问题是COMMENTHISTORY每个COMMENT都有多行,因此SELECT语句会为每个评论检索多行。

我需要检索每个评论的一行。一行中ch.Text和ch.Timestamp匹配最新相关的COMMENTHISTORY行。

有什么解决方法吗?

谢谢。


我认为内连接会对你有所帮助。 - rptwsthi
1
尝试对ch.Text和ch.Timestamp取最大值,并按照其他两个进行分组。 - Milen
4
SQL Server/Oracle/MySQL? 请修改问题并添加你正在使用的数据库标签。 - shahkalpesh
COMMENTHISTORY 有行 ID 列吗? - Justin
3
[戒掉的坏习惯:使用旧式的JOIN操作](https://sqlblog.org/2009/10/08/bad-habits-to-kick-using-old-style-joins)- 那种旧式的逗号分隔的表列表风格已经在 ANSI-92 SQL标准中被废弃(已经超过20年了!) - marc_s
9个回答

1
这将解决你的问题。
SELECT c.Id, c.Userid, ch.Text, ch.Timestamp
FROM COMMENT c LEFT JOIN COMMENTHISTORY ch on C.ID = ch.comment_id
WHERE ch.CommentId = c.Id
GROUP BY c.id
ORDER BY ch.Timestamp DESC

0
SELECT c.Id, c.Userid, ch.Text, max(ch.Timestamp)
FROM COMMENT c, COMMENTHISTORY ch
WHERE ch.CommentId = c.Id
GROUP BY C.ID, c.userid, ch.text

除了被聚合的列之外,GROUP BY 中不包含所有必要的列,这个能行吗? - shahkalpesh
既然你已经使用了时间戳的 MAX,那么是否有必要使用 ORDER BY 呢? - sarwar026

0

这可能会对你有所帮助:

SELECT c.Id, c.Userid, ch.Text, ch.Timestamp
FROM COMMENT c LEFT JOIN COMMENTHISTORY ch ON ch.CommentId = c.Id
ORDER BY ch.Timestamp DESC

不起作用。这个查询结果与我的查询完全相同(即所有COMMENTHISTORY行而不仅仅是最新的一行)。 - user2500179

0

请使用:

SELECT c.Id, c.Userid, Max(ch.Text), max(ch.Timestamp)
FROM COMMENT c, COMMENTHISTORY ch
WHERE ch.CommentId = c.Id
GROUP BY C.ID, c.Userid
ORDER BY ch.Timestamp DESC

Max(ch.Text), max(ch.Timestamp) 可能不会返回相同的行。 - bendataclear
“COMMENTHISTORY.TimeStamp”列在ORDER BY子句中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。 - Drammy

0
  SELECT c.Id, c.Userid, max(ch.Timestamp),max(ch.text)
    FROM COMMENT c, COMMENTHISTORY ch
    WHERE ch.CommentId = c.Id
    Group By  c.Id, c.Userid
    ORDER BY ch.Timestamp DESC

Max(ch.Text), max(ch.Timestamp) 可能不会返回相同的行。 - bendataclear

0

这个查询将选择给定评论ID的最新记录的最后一个CommentHistory记录:

WITH LastComment AS
(
    SELECT CH.CommentId, MAX(CH.Timestamp) as Date
    FROM COMMENTHISTORY CH
    GROUP BY CH.CommentId
)

SELECT c.Id, c.Userid, ch.Text, ch.Timestamp
FROM COMMENT c
INNER JOIN LastComment lc ON LC.CommentId = c.Id
INNER JOIN COMMENTHISTORY ch ON ch.CommentId = lc.CommentId and ch.TimeStamp = lc.Date
ORDER BY ch.Timestamp DESC

0

查询:

SELECT c.Id, 
       c.Userid, 
       ch.Text, 
       ch.Timestamp
FROM COMMENT c
INNER JOIN COMMENTHISTORY ch
  ON ch.CommentId = c.Id
WHERE ch.Timestamp = (SELECT MAX(ch2.Timestamp)
                      FROM COMMENTHISTORY ch2
                      WHERE ch2.CommentId = c.Id )
ORDER BY ch.Timestamp DESC

0

这样应该可以解决了...

;WITH CTE AS
(
    SELECT  ch.CommentId, ch.Text, ch.TimeStamp, ROW_NUMBER() OVER (PARTITION BY     ch.CommentId ORDER BY ch.TimeStamp DESC) RowNum
    FROM    COMMENTHISTORY ch
)
SELECT          c.Id, c.Userid, CTE.Text, CTE.TimeStamp
FROM            COMMENT c
    INNER JOIN  CTE ON c.Id = CTE.CommentId
WHERE           RowNum = 1

0

尝试使用内连接,并将您的条件放在 Where 子句中。有关更多信息,请查看此链接:连接选择图表


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接