【问题标题】:Removing Duplicates in SQL删除 SQL 中的重复项
【发布时间】:2017-11-17 05:46:56
【问题描述】:

我需要选择所有尚未开票的订单 and BR.isInvoiced = 0

Select DG.DateGenerated, oit.OrderIdentifier, BR.isInvoiced, BR.hash, BR.OrderNumber, UL.FirstName, UL.LastName from [Order] O INNER JOIN BillingReport BR ON O.OrderNumber = BR.OrderNumber INNER JOIN UsersLib UL ON UL.UserID = O.UserId INNER JOIN Order_Identifier_Transactional OIT ON O.OrderNumber = OIT.OrderNumber INNER JOIN (Select OP.OrderNumber, OP.DateGenerated from OrderProducts OP group by OP.OrderNumber, op.DateGenerated having op.DateGenerated in (select MAX(op.DateGenerated) from orderproducts ))as DG ON DG.OrderNumber = O.OrderNumber where O.Status = 'COMPLETED' and BR.isInvoiced = 0 and UL.UserName not like '%Support%' and UL.AccountNumber != '10000001001' and BR.invoicepdf is NULL and BR.ispaid = 0

然后只选择每个订单号生成的最近日期 但使用这个查询我仍然发现一些像这样的重复:

【问题讨论】:

  • 如果您仔细观察,您会发现这两个突出显示的记录的 DateGenerated 并不相同。因此,它们在技术上是不同的记录,而不是重复的。
  • 是的。但我们正在寻找最近生成的日期。如附图所示

标签: sql sql-server duplicates inner-join having


【解决方案1】:

这是解决问题的最快方法:

SELECT MAX(DateGenerated), OrderIdentifier, isInvoiced, hash, OrderNumber, 
    FirstName, LastName
FROM (Select DG.DateGenerated, oit.OrderIdentifier, BR.isInvoiced, BR.hash, 
    BR.OrderNumber, UL.FirstName, UL.LastName   from [Order] O
    INNER JOIN BillingReport BR
    ON O.OrderNumber = BR.OrderNumber
    INNER JOIN UsersLib UL
    ON UL.UserID = O.UserId
    INNER JOIN Order_Identifier_Transactional OIT
    ON O.OrderNumber = OIT.OrderNumber
    INNER JOIN
     (Select OP.OrderNumber, OP.DateGenerated from OrderProducts OP 
     group by OP.OrderNumber, op.DateGenerated
      having op.DateGenerated in (select MAX(op.DateGenerated) from orderproducts ))as DG
    ON DG.OrderNumber = O.OrderNumber
    where O.Status = 'COMPLETED' 
    and BR.isInvoiced = 0
    and UL.UserName not like '%Support%' 
    and UL.AccountNumber != '10000001001' 
    and BR.invoicepdf is NULL 
    and BR.ispaid = 0)
GROUP BY OrderIdentifier, isInvoiced, hash, OrderNumber, FirstName, LastName

我获取了您的整个查询,将其用引号括起来,然后使用围绕 DateGenerated 的 MAX 聚合函数从中选择。最后,我为所有其他字段添加了 GROUP BY 子句。

【讨论】:

  • 重复我们仍然出现。
  • 这段代码现在可以工作了,但是我在括号和BR.ispaid = 0) as OA 的末尾加上了一个别名,代码就可以工作了。谢谢大家的帮助,谢谢大家
【解决方案2】:

你的 MAX 选择中有一个别名

(select MAX(op.DateGenerated) from orderproducts )

试试这个:

(select MAX(DateGenerated) from orderproducts where ordernumber = op.ordernumber )

【讨论】:

    【解决方案3】:

    您是否尝试过在第二个INNER JOIN 上使用UNIQUE

    INNER JOIN
         (Select UNIQUE OP.OrderNumber, OP.DateGenerated
          from OrderProducts OP 
          group by OP.OrderNumber, op.DateGenerated
          having op.DateGenerated in
                (select MAX(op.DateGenerated)
                 from orderproducts )) as DG
    ON DG.OrderNumber = O.OrderNumber
    

    【讨论】:

    • 尝试唯一码时也会出现重复
    【解决方案4】:
    Select DG.DateGenerated, oit.OrderIdentifier, BR.isInvoiced, BR.hash, 
        BR.OrderNumber, UL.FirstName, UL.LastName   from [Order] O
        INNER JOIN BillingReport BR
        ON O.OrderNumber = BR.OrderNumber
        INNER JOIN UsersLib UL
        ON UL.UserID = O.UserId
        INNER JOIN Order_Identifier_Transactional OIT
        ON O.OrderNumber = OIT.OrderNumber
        INNER JOIN
         (Select OP.OrderNumber, OP.DateGenerated from OrderProducts OP 
         group by OP.OrderNumber, op.DateGenerated
          having op.DateGenerated in (select MAX(op.DateGenerated) from orderproducts OP1 WHERE OP.OrderNumber =  OP1.OrderNumber))as DG
        ON DG.OrderNumber = O.OrderNumber
        where O.Status = 'COMPLETED' 
        and BR.isInvoiced = 0
        and UL.UserName not like '%Support%' 
        and UL.AccountNumber != '10000001001' 
        and BR.invoicepdf is NULL 
        and BR.ispaid = 0
    

    您在找到最近生成的日期时缺少WHERE OP.OrderNumber = OP1.OrderNumber。希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2019-07-26
      • 1970-01-01
      • 1970-01-01
      • 2019-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多