Справка по UPDATE с пользовательским INNER JOIN - T-SQL - PullRequest
1 голос
/ 13 декабря 2010

У меня есть таблица для каждого типа местоположения (город, улица, страна и т. Д.).

Теперь у меня есть хранимая процедура, которая должна возвращать список «Местоположений» с их «Наивысшим рейтингом проверки».".

У меня есть временная таблица для" Местоположений "(может быть что угодно - Улица, Город и т. Д.).

Я вставляю в временную таблицу сначала из городов, затем из улиц, затем Страны и т. д.

В итоге я получаю временную таблицу «Местоположения», и для каждого из них мне нужно получить обзор с наивысшим рейтингом.(наивысший = BaseScore, например, 5,0)

Количество элементов:

  • Местоположение Многие..Много Сообщений (таблица присоединений PostLocations)
  • Сообщение 1..1 Обзор
  • Обзор 1..1 Оценка

Таблица временных местоположений:

DECLARE @ResultSet TABLE
(
    [LocationId]                INT,
    [TopReviewId]               INT, -- starts out NULL, need to fill in
    [TopReviewContent]          NVARCHAR(MAX)  -- starts out NULL, need to fill in       
)

-- Get the Top Rated Review for each location.
    UPDATE      ResultSet
    SET         TopReviewId = TopReview.PostId, 
                TopReviewContent = TopReview.Content
    FROM        @ResultSet ResultSet
    INNER JOIN
    (
        SELECT TOP 1 pl.LocationId, p.postid, p.Content
        FROM PostLocations pl
        INNER JOIN Posts p
        ON pl.PostId = p.PostId
        INNER JOIN Reviews r
        ON p.PostId = r.PostId
        INNER JOIN Scores s
        ON r.ScoreId = s.ScoreId
        INNER JOIN @ResultSet rs
        ON pl.LocationId = rs.LocationId
        ORDER BY s.BaseScore DESC
    ) AS TopReview
    ON  ResultSet.LocationId = TopReview.LocationId

    INNER JOIN  PostLocations pl
    ON          ResultSet.LocationId = pl.LocationId
    INNER JOIN  Posts p
    ON          pl.PostId = p.PostId
    INNER JOIN  Reviews r
    ON          pl.PostId = r.PostId


    -- Now return the Results:
    SELECT      TOP 10
                [LocationId],
                [TopReviewId],             
                [TopReviewContent]        

    FROM        @ResultSet

Это вывод В настоящее время я получаю

LocationId    TopReviewId   TopReviewContent
1             12313         Blah Blah
2             NULL          NULL
3             NULL          NULL

Это вывод Я хочу

LocationId    TopReviewId   TopReviewContent
1             12313         Blah Blah
2             44323         Meh meh
3             5345345       Pew pew

Ответы [ 2 ]

4 голосов
/ 13 декабря 2010

Может быть, это наивно, но вы пробовали:

select c.name, max(price)
from 
    customer c inner join
    product p on p.customerid = c.customerid
group by c.name

, если вы хотите получить лучший обзор, вы бы сделали это:для каждого местоположения вы бы сделали это:

SELECT pl.LocationId, p.postid, p.Content, max(s.BaseScore)
FROM PostLocations pl  
    INNER JOIN Posts p    
    ON pl.PostId = p.PostId  
    INNER JOIN Reviews r  
    ON p.PostId = r.PostId  
    INNER JOIN Scores s  
    ON r.ScoreId = s.ScoreId  
group by p1.locationid, p.postid, p.content  
0 голосов
/ 13 декабря 2010

Я немного сбит с толку относительно того, что вы пытаетесь сделать.но чтобы получить список клиентов вместе с их самым высоким идентификатором заказа, не могли бы вы просто сделать это?

select customers.name, orders.orderid 
from customers join orders on customers.customerid = orders.customerid 
group by customers.customerid 
having max(orders.price);
...