如何不检索由于存储过程引起的重复行
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 的描述中,SellerId 在 TicketSeller table
((@sellerId > 0 AND t.SellerId = @sellerId) OR (@sellerId = 0 AND t.SellerId > 0))
您正在使用 t.SellerId
而不是 ts.SellerId
如果这是正确的代码(而不仅仅是拼写错误),那么我认为这就是您有双重记录的原因。
我一直在使用我的存储过程检索事件筛选条件:开始日期、结束日期、商店 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 的描述中,SellerId 在 TicketSeller table
((@sellerId > 0 AND t.SellerId = @sellerId) OR (@sellerId = 0 AND t.SellerId > 0))
您正在使用 t.SellerId
而不是 ts.SellerId
如果这是正确的代码(而不仅仅是拼写错误),那么我认为这就是您有双重记录的原因。