SQL,从两个表中选择,而不获取所有行
我有两个表:SQL,从两个表中选择,而不获取所有行,sql,select,Sql,Select,我有两个表:COMMENT和COMMENTHISTORY 现在我需要从两个表中选择单元格,如下所示: 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中的每个注释都有几行,因此SELECT最终会为每个注释检索几行 我需要的是为每个注释检
COMMENT
和COMMENTHISTORY
现在我需要从两个表中选择单元格,如下所示:
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
中的每个注释都有几行,因此SELECT
最终会为每个注释检索几行
我需要的是为每个注释检索一行。ch.Text和ch.Timestamp与最新相关的COMMENTHISTORY
行匹配的行
有什么办法吗
谢谢。这可能会帮助您:
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
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
使用以下命令:
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
这将解决您的问题
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
此查询将为给定注释id的最新记录选择lastCommentHisotry
record:
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
尝试使用内部联接,并将条件放入Where子句中。有关更多信息,请查看以下内容:-查询:
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
这应该可以
;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
我认为内部连接会对您有所帮助。试着用另外两个SQL Server/Oracle/MySQL最大化ch.Text和ch.Timestamp并分组?请修改问题以添加您正在使用的数据库的标记COMMENTHISTORY
has row ID column?-ANSI-92 SQL标准(20多年前!)停止了旧式的逗号分隔的表格列表样式。GROUP BY
除了聚合的列之外,不包含所有必需的列吗?既然您使用的是时间戳的MAX
,是否需要ORDER BY
(ch.Text),max(ch.Timestamp)
可能不会返回同一行,因为ORDER BY子句中的“COMMENTHISTORY.Timestamp”列无效,因为它不包含在聚合函数或GROUP BY子句中。同样max(ch.Text),max(ch.Timestamp)
可能不会返回同一行。此查询提供的结果与我自己的查询完全相同(即所有COMMENTHISTORY行,而不仅仅是最新的一行)
;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