我有2个表,分别是“项目”和“消息”。
Item表中的列类似Id,Amount等。
Messages表具有诸如ItemId,Count,Comment等列。
这两个表之间的公共链接是Item中的“ Id”和Messages中的“ ItemId”。
“消息”表中的“计数”列只是每个ItemId的注释计数。即,当用户更新任何记录的注释时,将在“消息”表中创建一个条目,并且该特定ItemId的计数显示为1。如果用户对同一记录再更新一个注释,则计数显示2,依此类推。如果用户不更新特定记录的注释,则根本不会在“消息”表中创建该条目(NULL)。
我想从Item表中捕获所有记录,而不管用户是否已更新评论。如果注释为0,则查询应在该记录的“注释”列中返回NULL。但是,如果用户已更新评论,则应选择“计数”最高的评论。例如。如果一个记录有8条注释,则查询应仅返回Messages.Count = 8的记录,而不返回所有8条记录。如果只有一条评论,那么应该可以看到该评论。
我写了LEFT OUTER JOIN,但由于显示了全部8条记录而无法通过。在结果中,我发现7条记录的计数为NULL,而第8条记录的计数为8,但是我只需要第8条记录,而无需其他7条记录。
任何帮助将不胜感激。以下是我的查询:
Select
Id,
Amount,
Messages.Comment As Comments
From Item
Left Outer Join Messages ON Messages.ItemId=Item.Id
Left Outer Join (Select ItemId, MAX(Id) as max_id from Messages Group by ItemId) T ON Messages.ItemId=T.ItemId and Messages.Id=T.max_id
Where amount > 100
答案 0 :(得分:0)
我已经使用临时表连接了一个示例,我认为它涵盖了您要查找的内容。只需删除临时表中的内容并替换为您的实际表,它应该可以工作。
CREATE TABLE #Item ( ID int PRIMARY KEY,
Amount numeric(9,2))
CREATE TABLE #Messages ( ItemId int REFERENCES #Item(ID),
[Count] smallint,
Comment nvarchar(max))
INSERT INTO #Item (ID, Amount)
SELECT 1, 100
UNION
SELECT 2, 120
UNION
SELECT 3, 140
UNION
SELECT 4, 50
INSERT INTO #Messages ( ItemID,
[Count],
Comment)
SELECT 1, 1, 'Comment 1 - 1'
UNION
SELECT 1, 2, 'Comment 1 - 2'
UNION
SELECT 2, 1, 'Comment 2 - 1'
UNION
SELECT 2, 1, 'Comment 3 - 1'
UNION
SELECT 2, 2, 'Comment 3 - 2'
SELECT I.Id,
I.Amount,
M.Comment
FROM #Item AS I
OUTER APPLY ( SELECT TOP 1 M.Comment
FROM #Messages AS M
WHERE M.ItemId = I.ID
ORDER BY M.[Count] DESC) AS M
WHERE i.amount > 100
DROP TABLE #Messages
DROP TABLE #Item
答案 1 :(得分:0)
努力吧......
Select
Id,
Amount,
T.Comment As Comments
From Item
Left Outer Join (Select ItemId, MAX(Id) as max_id, Comments from Messages Group by ItemId) T ON Item.ItemId=T.ItemId
Where amount > 100