避免多行项目连接中出现重复的订单号
涉及每个订单包含多个行项目的表的数据库连接通常会导致结果中出现重复的订单号。 本文探讨了针对每个唯一订单仅检索一条记录的有效解决方案。
最初的方法及其缺点
一种简单的方法可能涉及仅选择“TOP 1”订单项。 但是,由于从内部 select 语句直接访问外部表的限制,此操作失败。
高效解决方案:交叉应用
CROSS APPLY
运算符提供了一个优雅的解决方案:
<code class="language-sql">SELECT Orders.OrderNumber, LineItems2.Quantity, LineItems2.Description FROM Orders CROSS APPLY ( SELECT TOP 1 LineItems.Quantity, LineItems.Description FROM LineItems WHERE LineItems.OrderID = Orders.OrderID ) LineItems2</code>
CROSS APPLY
有效检索每个订单的第一个订单项,防止重复的订单号。
旧版 SQL Server 版本的替代方案:INNER JOIN
对于 2005 年之前的 SQL Server 版本,INNER JOIN
提供了类似的解决方案:
<code class="language-sql">SELECT Orders.OrderNumber, LineItems.Quantity, LineItems.Description FROM Orders JOIN LineItems ON LineItems.LineItemGUID = ( SELECT TOP 1 LineItemGUID FROM LineItems WHERE OrderID = Orders.OrderID )</code>
确保确定性结果
至关重要的是,没有 TOP 1
子句的 ORDER BY
是不确定的。 即使数据未更改,选定的行项目也可能在查询执行之间有所不同。 始终在内部查询中包含 ORDER BY
子句以保证结果一致。
以上是连接具有多个行项目的表时如何消除重复的订单号?的详细内容。更多信息请关注PHP中文网其他相关文章!