Вопрос по sql – Последняя запись таблицы соединений

3

Я смотрю на правильный код SQL, чтобы объединить 2 таблицы и показать только последнюю запись таблицы подробностей.

У меня есть БД с 2 таблицами,

Deals 
   DealID
   Dealname
   DealDetails

DealComments
   dcID
   DealID
   CommentTime
   CommentPerson
   Comment

Есть несколько комментариев для каждой сделки, но я хотел бы создать ПРОСМОТР, который отображает все сделки и только последний комментарий от каждой сделки (определяется в поле CommentTime)

Что вы хотите, если для какой-то сделки есть два или более последних комментария с одинаковым временем? A-K

Ваш Ответ

7   ответов
1

Попробуй это:

CREATE VIEW DealsWithLastComment
AS
   SELECT
       D.*, DC.*
   FROM
       Deals D INNER JOIN DealComments DC
       ON D.DealID = DC.DealID
       GROUP BY D.DealID, DC.CommentTime
       HAVING DC.CommentTime = MAX(DC.CommentTime)
1

Как насчет этого запроса.

select * from Deals 
left join DealComments on Deals.DealID = DealComments.DealID and DealComments.CommentTime = (SELECT CommentTime  FROM DealComments WHERE DealComments.DealID = Deals.DealID ORDER BY CommentTime DESC limit 1)
1

Не очень элегантно, но работает в Oracle:

select dealid,
       dealname,
       dealdetails,
       comment,
from
(
  select a.dealid,
         a.dealname,
         a.dealdetails,
         b.commenttime,
         b.comment,
         max(commenttime) over (partition by a.dealid) as maxCommentTime
  from deals a inner join dealcomments b on b.dealid = a.dealid
)
where comment = maxCommentTime
Error: User Rate Limit Exceeded
9
select a.dealid
, a.dealname
, a.dealdetails
, b.dcid
, b.commenttime
, b.commentperson
, b.comment
from deals a, dealcomments b
where b.dealid = a.dealid
  and b.commenttime = (select max(x.commenttime)
                       from dealcomments x
                       where x.dealid = b.dealid)

РЕДАКТИРОВАТЬ: я не прочитал начальный вопрос достаточно близко и не заметил, что все строки сделки были необходимы в представлении. Ниже мой исправленный ответ:

select a.dealid
, a.dealname
, a.dealdetails
, b.dcid
, b.commenttime
, b.commentperson
, b.comment
from deals a left outer join (select x.dcid
, x.dealid
, x.commenttime
, x.commentperson
, x.comment
from dealcomments x
where x.commenttime = (select max(x1.commenttime)
                       from dealcomments x1
                       where x1.dealid = x.dealid)) b
on (a.dealid = b.dealid)
Error: User Rate Limit Exceeded Khalid Rahaman
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Khalid Rahaman
1

Обязательный no-subquery-нигде-ответ:

select d.*
       , dc.*
from   Deals d
       left outer join DealComments dc 
       on d.DealID = dc.DealID
       left outer join DealComments dc1 
       on d.DealID = dc1.DealID 
   and 
       dc1.CommentTime > dc.CommentTime
where  dc1.CommentTime is null

Покажите мне все вDeals а такжеDealComments когда нетCommentTime больше, чем любое время комментария для конкретногоDealID.

Изменить: как проницательно указывает Алексей Кузнецов в комментарии: ФП просилall сделки будут отображаться - есть ли у сделки комментарий или нет. Итак, я изменил первыйJOIN отINNER вLEFT OUTER.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
1
select
  d.DealID, dc1.dcID, dc1.Comment, dc1.CommentPerson, dc1.CommentTime
from
  Deals d
inner join
  DealComments dc1 on dc1.DealID = d.DealID
where
  dc1.CommentTime = (select max(dc2.CommentTime) from DealsComments dc2 where dc2.DealId = dc1.DealId)
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
1

Попробуй это..

SELECT D.*,DC1.Comment 
FROM Deals AS D
   INNER JOIN DealComments AS DC1
        ON D.DealId = DC1.DealID
    INNER JOIN 
    (
        SELECT 
            DealID,
            MAX(CommentTime) AS CommentTime
        FROM DealComments AS DC2
        GROUP BY DealID
    ) AS DC2
        ON DC2.DealId = DC.DealId
            AND DC2.CommentTime = DC1.CommentTime

Похожие вопросы