【问题标题】:Getting Repeated values in SQL在 SQL 中获取重复值
【发布时间】:2012-12-19 09:25:07
【问题描述】:

我拼命地越来越努力地完成这件事,但还没有成功。运行此查询时,我得到重复的值。

 select 
    tbl_ShipmentStatus.ShipmentID
    ,Tbl_Contract.ContractID,
    Tbl_Contract.KeyWinCountNumber,
    Tbl_Item.ItemName,
    Tbl_CountryFrom.CountryFromName,
    Tbl_CountryTo.CountryToName,
    Tbl_Brand.BrandName,
    Tbl_Count.CountName,
    Tbl_Seller.SellerName,
    Tbl_Buyer.BuyerName, 
    Tbl_Contract.ContractNumber,
    Tbl_Contract.ContractDate,
    tbl_CountDetail.TotalQty,
    tbl_CostUnit.CostUnitName,
    tbl_Comission.Payment,
    tbl_Port.PortName,
    Tbl_Contract.Vans,
    tbl_Comission.ComissionPay,
    tbl_Comission.ComissionRcv,
    tbl_CountDetail.UnitPrice,
    tbl_Comission.ComissionRemarks,
    tbl_CountDetail.Amount,
    tbl_LCStatus.LCNumber,
    tbl_ShipmentStatus.InvoiceNumber,
    tbl_ShipmentStatus.InvoiceDate,
    tbl_ShipmentStatus.BLNumber,
    tbl_ShipmentStatus.BLDate,
    tbl_ShipmentStatus.VesselName,
    tbl_ShipmentStatus.DueDate
     from tbl_ShipmentStatus 

    inner join tbl_LCStatus
    on
    tbl_LCStatus.LCID = tbl_ShipmentStatus.LCStatusID

    inner join Tbl_Contract
    on
    tbl_LCStatus.ContractID = Tbl_Contract.ContractID 

    inner join Tbl_CountDetail
    on Tbl_Contract.ContractID = Tbl_CountDetail.ContractId

    inner join tbl_Comission
    on
    tbl_Comission.ContractID = Tbl_Contract.ContractID

    inner join Tbl_Item
    on
    Tbl_Item.ItemID = Tbl_Contract.ItemID

    inner join Tbl_Brand
    on Tbl_Brand.BrandID = Tbl_Contract.BrandID
    inner join Tbl_Buyer
    on Tbl_Buyer.BuyerID = Tbl_Contract.BuyerID
    inner join Tbl_Seller
    on Tbl_Seller.SellerID = Tbl_Contract.SellerID
    inner join Tbl_CountryFrom
    on Tbl_CountryFrom.CountryFromID = Tbl_Contract.CountryFromID
    inner join Tbl_CountryTo
    on
    Tbl_CountryTo.CountryToID = Tbl_Contract.CountryToID
    inner join Tbl_Count
    on
    Tbl_Count.CountID = Tbl_CountDetail.CountId
    inner join tbl_CostUnit
    on tbl_Comission.CostUnitID = tbl_CostUnit.CostUnitID
    inner join tbl_Port
    on tbl_Port.PortID = tbl_Comission.PortID

    where tbl_LCStatus.isDeleted = 0
    and tbl_ShipmentStatus.isDeleted =0
    and tbl_LCStatus.isDeleted = 0
    and Tbl_CountDetail.isDeleted = 0
    and Tbl_Contract.isDeleted = 0

    and tbl_ShipmentStatus.LCStatusID = 5

我还附上了我的结果行集的图片。 任何关于为什么会发生这种情况的建议都非常值得推荐。

Result Set

【问题讨论】:

    标签: sql-server-2008 inner-join


    【解决方案1】:

    当您在两个表之间存在隐式部分交叉连接(笛卡尔积)时,通常会发生这种情况。这就是我在这里的样子。

    当您拥有多对多关系时,这种情况最常发生。例如,如果单个Album 允许多个Artists 和多个Songs,并且ArtistsSongs 之间的唯一关系是Album,那么@987654327 之间本质上是多对多关系@ 和 Songs。如果您同时从所有三个表中进行选择,您将隐式交叉连接 ArtistsSongs,这可能不是您想要的。

    查看您的查询,我看到Tbl_CountDetailtbl_ComissionTbl_Contract 之间存在多对多。尝试消除其中一个连接以测试行为是否消失。

    【讨论】:

      【解决方案2】:

      尝试使用DISTINCT 关键字。它应该可以解决您的问题

      Select DISTINCT ....
      

      据我所知,您的记录不重复。

      但是

      注意CountName 列和Shipment ID

      每一行的组合都是唯一的。因此,据我所知,这些值是独一无二的。尽量不要选择CountName

      好吧,如果您有不同的行,则不是重复问题。问题是在加入期间发生组合,您不希望它复制结果。

      要么不要选择CountName,要么你的数据有误。

      这些行中只有一个应该为真,无论是 6 与 Count2 还是 6 与 Count1。 7 也是如此。事实上,当你不应该这样做时,你得到这两个表明逻辑错误

      【讨论】:

      • CountName 和 Shipment ID 的组合只有 2 行是唯一的。上面的查询应该返回 2 条记录,但它会将 2 条记录复制到 4 条。
      • dude 6..count 2 , 7..count 2 , 6..count 1, 7..count 1。这是我看到的 4 对不同的对
      • 那么有什么办法可以解决这个问题呢?
      • 这似乎是一个逻辑错误。很明显,我帮不了你。只有一个数据应该为真 6...Count 1 OR 6...Count 2 。>> 它不能同时是你假设应该只打印一个
      猜你喜欢
      • 2012-10-12
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-25
      • 1970-01-01
      • 2018-02-09
      • 2017-09-12
      相关资源
      最近更新 更多