【问题标题】:Get DISTINCT records on INNER JOIN SQL Server在 INNER JOIN SQL Server 上获取 DISTINCT 记录
【发布时间】:2018-06-28 10:35:37
【问题描述】:

我有两张桌子。我有通过INNER JOIN 子句将第一个表连接到第二个表的查询。结果表明存在冗余或重复的结果。在我下面的示例中,结果有 4 条记录。我想区分SdiID,我希望只得到两条记录,因为sdiID 只有两条唯一记录。我尝试在选择后添加DISTINCT sdiID,但仍然有 4 条记录。请帮忙。这是我的查询。

    DECLARE @PageNumber AS INT, @RowspPage AS INT 
        SET @PageNumber = 1 
        SET @RowspPage = 20 
        SELECT totalCount = COUNT(*) OVER(), mailbox.ID as mailboxID, 
          sdi.ID as sdiID
           FROM [SDI].dbo.UserDocumentLocationOutbox mailbox 
           INNER JOIN [SDI].dbo.SDITransaction
           sdi on mailbox.SDITransactionID=sdi.ID 
         INNER JOIN [SYSDB].dbo.DocumentType doc on sdi.DocumentTypeID=doc.ID 
    where mailbox.CommunityID = '9ff10c7a-37f5-4580-9163-6ada55194ca7' 
    and mailbox.UserProfileID = 'f9791614-8cc0-42e3-87d1-53709bc1e099' 
    and doc.CommunityID = '9ff10c7a-37f5-4580-9163-6ada55194ca7' 
    and doc.Active=1 and doc.HideInMailbox=0  
    order by sdi.ProcessedDateTime desc 
OFFSET ((@PageNumber - 1) * @RowspPage) ROWS FETCH NEXT @RowspPage ROWS ONLY

这是结果

【问题讨论】:

  • 对于每个“重复”sdilD 记录对,有两个不同的mailboxID!你希望如何解决这个问题?如果您不关心mailboxID,只需使用 distinct 但从 select 子句中删除mailboxID。请注意,不同的字段适用于所有字段,而不仅适用于不同单词之后的字段。另一种选择是将所有邮箱 ID 放在逗号分隔的字段中,这需要一些工作。告诉我们您需要什么。
  • Distinct 将在完整的行上工作,并且由于 sdiID 有不同的邮箱 ID,因此您将获得 sdiID 的两到两行。从选择中删除mailboxid后尝试,您将只有两行。
  • 您是要计算 sdiID 的邮箱 ID 数,还是要数什么?
  • 感谢各位的帮助。邮箱 ID 并不重要。下面的答案符合我的问题。

标签: sql sql-server adhoc-queries


【解决方案1】:
  with cte as (SELECT ROW_NUMBER() over(PARTITION BY sdi.ID order by sdi.ID) as rn,totalCount = COUNT(*) OVER(), mailbox.ID as mailboxID, 
          sdi.ID as sdiID
           FROM [SDI].dbo.UserDocumentLocationOutbox mailbox 
           INNER JOIN [SDI].dbo.SDITransaction
           sdi on mailbox.SDITransactionID=sdi.ID 
         INNER JOIN [SYSDB].dbo.DocumentType doc on sdi.DocumentTypeID=doc.ID 
    where mailbox.CommunityID = '9ff10c7a-37f5-4580-9163-6ada55194ca7' 
    and mailbox.UserProfileID = 'f9791614-8cc0-42e3-87d1-53709bc1e099' 
    and doc.CommunityID = '9ff10c7a-37f5-4580-9163-6ada55194ca7' 
    and doc.Active=1 and doc.HideInMailbox=0  
    order by sdi.ProcessedDateTime desc 
OFFSET ((@PageNumber - 1) * @RowspPage) ROWS FETCH NEXT @RowspPage ROWS ONLY)
select totalCount, mailboxID, sdiID
from cte 
where rn < 2

【讨论】:

  • 这就是我要找的。顺便一提 ”;”在 with 子句之前缺少。谢谢。
  • @JobertEnamno 很高兴为您提供帮助 =)
【解决方案2】:

由于您有 4 个不同的邮箱 ID 值,因此您将始终得到 4 个结果。即,您的每个 sdiID 都有两个关联的 MailboxID,因此它们是不同的记录。您可以通过选择 MAX(mailbox.id) 作为 mailboxID 或 MIN(Mailbox.id) 作为 mailboxID 并按 ID 分组来删除每个 ID 中的一个?

【讨论】:

  • 这是问题的重点:如何修改查询以获得描述的结果
猜你喜欢
  • 2012-01-23
  • 2016-12-23
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多