数据库表连接:仅选择每个订单的第一个行项目
在数据库操作中,连接像 Orders
和 LineItems
这样的表时会出现一个常见的挑战,其中一个订单可以有多个关联的行项目。 这通常会导致连接结果集中出现冗余数据。 目标是高效地仅检索每个订单的一个订单项。
简单的方法可能涉及使用 TOP 1
,但这可能会导致子查询中没有正确的表引用的错误。
有效解决方案:CROSS APPLY
和 JOIN
与 ORDER BY
两种强大的方法有效地解决了这个问题:
方法一:使用CROSS APPLY
此方法使用 CROSS APPLY
将 Orders
表与子查询连接起来,该子查询为每个订单选择最上面的行项目:
<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>
方法 2:将 JOIN
与 ORDER BY
此方法使用 JOIN
子句,其中连接条件从对订单项进行排序的子查询中选择 LineItemGUID
,并为每个订单选择最上面的一个:
<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 ORDER BY LineItemGUID );</code>
这两种方法都确保每个订单仅返回一个订单项。 至关重要的是,在子查询中包含 ORDER BY
子句对于确定性结果至关重要。 将 ORDER BY
与 TOP 1
一起省略会导致不可预测的结果,因为“第一个”行项目可能会因查询执行而异。 使用 ORDER BY
可以保证根据所选的订购标准一致地选择特定的订单项。
以上是连接数据库表时如何高效地仅选择每个订单的第一个行项目?的详细内容。更多信息请关注PHP中文网其他相关文章!