左外部联接返回额外的记录

时间:2018-10-16 20:01:22

标签: sql-server transactions left-join

我有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

2 个答案:

答案 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