如何在SQL JOIN查询中选择DISTINCT结果

时间:2012-07-28 08:39:48

标签: sql join distinct

这是我的查询所以请检查并告诉我。在此查询中成功执行但distinct不起作用:

SELECT
  DISTINCT(ticket_message.ticket_id),
  support_ticket.user_id,
  support_ticket.priority,
  support_ticket.subject,
  support_ticket.status,
  ticket_message.message
FROM
  support_ticket
  LEFT OUTER JOIN ticket_message ON support_ticket.ticket_id = ticket_message.ticket_id
  LEFT OUTER JOIN assign_ticket ON ticket_message.ticket_id = assign_ticket.ticket_id

2 个答案:

答案 0 :(得分:0)

使用此声明:

SELECT DISTINCT
    ticket_message.ticket_id
FROM 
    support_ticket
LEFT OUTER JOIN ticket_message ON 
    support_ticket.ticket_id = ticket_message.ticket_id
LEFT OUTER JOIN assign_ticket ON 
    ticket_message.ticket_id = assign_ticket.ticket_id

只要您在查询中添加更多列,DISTINCT也会考虑它们。

答案 1 :(得分:0)

distinct一词是关键字SELECT修饰符。因此,您需要将其视为SELECT DISTINCT,并且它始终在整个行中运行。它只是忽略了下面的括号:

select distinct(ticket_message.ticket_id)

因为与众不同不是函数。

所以。我们似乎拥有的是带有相关消息的支持通知单。每张支持票通常有多个消息,因此我怀疑您想要的是更复杂的。例如,您可能只需要每张支持通知单的最新消息。

要获得最新,我们需要一个时间戳(或“日期时间”)列,并且我们还需要知道您的数据库是否支持“窗口功能”。假设您有一个名为message_at的时间戳列,并且您的数据库确实支持窗口函数,那么这将减少行数:

SELECT 
    support_ticket.ticket_id
  , support_ticket.user_id
  , support_ticket.support_section
  , support_ticket.priority
  , support_ticket.subject
  , support_ticket.status
  , tm.file
  , tm.message
  , assign_ticket.section_id
  , assign_ticket.section_admin_id
FROM support_ticket
LEFT OUTER JOIN (
        SELECT
            ticket_id
          , file
          , message
          , ROW_NUMBER() OVER (PARTITION BY ticket_id ORDER BY message_at DESC) AS row_num
        FROM ticket_message
    ) tm ON support_ticket.ticket_id = tm.ticket_id
        AND tm.row_num = 1
LEFT OUTER JOIN assign_ticket ON tm.ticket_id = assign_ticket.ticket_id

ROW_NUMBER() OVER (PARTITION BY ticket_id ORDER BY message_at DESC)将数字1分配给最近消息,随后我们忽略所有> 1的行,从而消除了结果中不必要的重复。

所以

我们真的需要了解有关您的实际数据,正在使用的数据库(和版本)以及实际需求的更多信息。 几乎可以肯定,选择与众不同并不是您要实现的目标的正确方法。

我建议您阅读以下内容:Provide a Minimal Complete Verifiable Example (MCVE)  和Why should I provide a MCVE