【问题标题】:MS SQL removing Duplicates when using DISTINCT/INNER JOINsMS SQL 在使用 DISTINCT/INNER JOIN 时删除重复项
【发布时间】:2016-08-17 12:55:26
【问题描述】:

大家好,我正在使用以下查询来获取一些数据:

SELECT DISTINCT 
    CAST(APL.ProjectID AS nvarchar(4000))         AS ProjectID,
    CAST(APL.StatusOrder AS nvarchar(4000))       AS StatusOrder,
    CAST(APL.DateModified AS nvarchar(4000))      AS DateModified,  
    CAST(APL.PType AS nvarchar(4000))             AS PType,
    CAST(APL.PName AS nvarchar(4000))             AS PName,
    CAST(APL.PostDate AS nvarchar(4000))          AS PostDate,
    CAST(APL.TBillID AS nvarchar(4000))           AS TBillID,
    CAST(APL.Rate AS nvarchar(4000))              AS Rate,
    CAST(APL.Amount AS nvarchar(4000))            AS Amount,
    CAST(P.PContact AS nvarchar(4000))            AS PContact,
    CAST(P.PEMail AS nvarchar(4000))              AS PEMail,
    CAST(P.PPhone AS nvarchar(4000))              AS PPhone,
    CAST(P.PFax AS nvarchar(4000))                AS PFax,
    CAST(APL.CompDate AS nvarchar(4000))          AS CompDate,
    CAST(PS.Comments AS nvarchar(4000))           AS Comments,
    CAST(PS.PSID AS nvarchar(4000))               AS PSID,
    CAST(PS.Status AS nvarchar(4000))             AS Status 
FROM [billing].[dbo].[ActiveProjList]         AS APL 
INNER JOIN [billing].[dbo].[tblPro]           AS P ON APL.ProjectID = P.ProjectID 
INNER JOIN [billing].[dbo].[tblPStatus]       AS PS ON APL.ProjectID = PS.ProjectID

但是,这会返回 141 的记录数。返回的正确记录应该只有46

我可以用来查看是否有任何重复的列是 ProjectID

【问题讨论】:

  • 您是否尝试过使用 GROUP BY ProjectID?
  • 其他栏目呢? MIN, MAX, AVG etc.?
  • @Jonny:如果我这样做,我会收到错误 Msg 8120, Level 16, State 1, Line 3 列 'ActiveProjList.StatusOrder' 在选择列表中无效,因为它不包含在内在聚合函数或 GROUP BY 子句中。

标签: sql-server duplicates inner-join distinct sql-server-2014


【解决方案1】:

试试这个

SELECT DISTINCT 
     CAST(APL.ProjectID AS nvarchar(4000))         AS ProjectID,
     MAX(CAST(APL.StatusOrder AS nvarchar(4000)))       AS StatusOrder,
     MAX(CAST(APL.DateModified AS nvarchar(4000)))      AS DateModified,  
     MAX(CAST(APL.PType AS nvarchar(4000)))             AS PType,
     MAX(CAST(APL.PName AS nvarchar(4000)))             AS PName,
     MAX(CAST(APL.PostDate AS nvarchar(4000)))          AS PostDate,
     MAX(CAST(APL.TBillID AS nvarchar(4000)))           AS TBillID,
     MAX(CAST(APL.Rate AS nvarchar(4000)))              AS Rate,
     MAX(CAST(APL.Amount AS nvarchar(4000)))            AS Amount,
     MAX(CAST(P.PContact AS nvarchar(4000)))            AS PContact,
     MAX(CAST(P.PEMail AS nvarchar(4000)))              AS PEMail,
     MAX(CAST(P.PPhone AS nvarchar(4000)))              AS PPhone,
     MAX(CAST(P.PFax AS nvarchar(4000))  )              AS PFax,
     MAX(CAST(APL.CompDate AS nvarchar(4000)))          AS CompDate,
     MAX(CAST(PS.Comments AS nvarchar(4000)))           AS Comments,
     MAX(CAST(PS.PSID AS nvarchar(4000)))               AS PSID,
     MAX(CAST(PS.Status AS nvarchar(4000)))             AS Status 
FROM 
      [billing].[dbo].[ActiveProjList]         AS APL 
INNER JOIN 
      [billing].[dbo].[tblPro]           AS P ON APL.ProjectID = P.ProjectID 
INNER JOIN 
      [billing].[dbo].[tblPStatus]       AS PS ON APL.ProjectID = PS.ProjectID
GROUP BY 
      APL.ProjectID

【讨论】:

  • 轰隆隆!谢谢你的帮助,乔尼!
  • 我会但不能因为 stackoverflow 在您接受答案之前有时间限制:o/
【解决方案2】:

SELECT DISTINCT 适用于SELECT 中的所有列。通常,使用ROW_NUMBER() 可以获得所需的结果:

with t as (
      SELECT CAST(APL.ProjectID AS nvarchar(4000))         AS ProjectID,
             . . .
      FROM [billing].[dbo].[ActiveProjList] APL INNER JOIN
           [billing].[dbo].[tblPro] P
           ON APL.ProjectID = P.ProjectID INNER JOIN
           [billing].[dbo].[tblPStatus] PS
           ON APL.ProjectID = PS.ProjectID
     )
select t.*
from (select t.*,
             row_number() over (partition by ProjectId
                                order by datemodified desc
                               ) as seqnum
      from t
     ) t
where seqnum = 1;

这会获取与最近的 datemodified 值关联的值——这似乎是一种合理的方法,因为没有关于您希望如何在重复项中进行选择的信息。

【讨论】:

  • 虽然这确实有效并且是第一个回复 - 它比 Jonny 给出的答案更麻烦。
  • @StealthRT。 . .这具有从一行中返回所有值的优点,这可能不是您的应用程序的要求。
猜你喜欢
  • 1970-01-01
  • 2012-07-24
  • 2021-04-23
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 2016-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多