Левое внешнее соединение, возвращающее дополнительные записи - PullRequest
0 голосов
/ 16 октября 2018

У меня есть 2 таблицы, а именно «Элемент» и «Сообщения».

В таблице элементов есть такие столбцы, как Id, Amount и т. Д.

В таблице сообщений есть такие столбцы, как ItemId, Count,Комментарий и т. Д.

Здесь общей связью между этими двумя таблицами является "Id" из Item и "ItemId" из сообщений.

Столбец «Количество» в таблице «Сообщения» - это просто количество комментариев на ItemId.т.е. когда пользователь обновляет комментарий для любой записи, запись создается в таблице «Сообщения», и счетчик для этого конкретного ItemId отображается как 1. Если пользователь обновляет еще один комментарий к той же записи, счетчик показывает 2 и так далее.Если пользователь не обновляет комментарий для определенной записи, запись вообще не создается в таблице сообщений (NULL).

Я хочу захватить все записи из таблицы элементов независимо от того, обновил ли пользователь комментарийили нет.Если есть 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 голосов
/ 17 октября 2018

пойти на это братан ....

 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
0 голосов
/ 16 октября 2018

Я подключил пример, используя временные таблицы, которые, я думаю, охватывают то, что вы ищете.Просто удалите материал временных таблиц и замените его фактическими таблицами, и это должно работать.

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
...