如何不检索由于存储过程引起的重复行

How to not retrieve duplicate row due to stored procedure

我一直在使用我的存储过程检索事件筛选条件:开始日期、结束日期、商店 ID、卖家 ID 和客户 ID。

首先,这是导致我出现问题的数据库的主要结构:

门票:

编号 参考 .. ..
15222 预订56654 .. ..

卖家:

编号 姓名 .. ..
41 凯蒂 .. ..
47 斯蒂芬 .. ..

售票员:

SellerId TicketId
47 15222
41 15222

效果很好,当我与多个卖家保存我的票时,它保存在多对多关系 TicketSeller 中,两行。这很正常。

但是当我执行我的存储过程时,它不是只检索一行,而是检索了两行,因为在 TicketSeller 中存在多对多关系。 问题可能是当我加入表格时但我没有成功修复它。

这是我在这些表之间进行连接时存储过程中的代码:

(...)
    FROM Ticket t 
    JOIN TicketSeller ts ON ts.TicketId = t.Id
    JOIN Seller e ON e.Id = ts.SellerId
    JOIN Customer c ON c.Id = t.CustomerId
    JOIN TicketProduct tp ON tp.TicketId = t.Id
    JOIN Product p ON p.Id = tp.ProductId
    LEFT JOIN Category ca ON ca.Id = p.CategoryId
    WHERE t.LicenseId = @licenseId AND t.[State] > 0 AND t.Type = 2 AND
    t.BookingAt >= @dateStart AND t.BookingEnd <= @dateEnd AND 
    ((@shopId is not null AND t.ShopId = @shopId) OR (@shopId = 0 AND t.ShopId > 0)) AND
    ((@sellerId > 0 AND t.SellerId = @sellerId) OR (@sellerId = 0 AND t.SellerId > 0)) AND
    ((@customerId > 0 AND t.CustomerId = @customerId) OR (@customerId = 0 AND t.CustomerId > 0))

根据您的代码示例,Ticket table 别名为 't',TicketSeller 别名为作为 'ts'

FROM Ticket t 
    JOIN TicketSeller ts ON ts.TicketId = t.Id

并且在您对 table 的描述中,SellerIdTicketSeller table

 ((@sellerId > 0 AND t.SellerId = @sellerId) OR (@sellerId = 0 AND t.SellerId > 0)) 

您正在使用 t.SellerId 而不是 ts.SellerId

如果这是正确的代码(而不仅仅是拼写错误),那么我认为这就是您有双重记录的原因。