限制 SQL 连接到第一个相关行
在 SQL 中有效连接多个表至关重要,但有时我们只需要相关表中的第一行。本文演示了如何将联接限制为单行,从而在处理一对多关系时避免重复行。
让我们看一个常见的场景:
我们有两个表,Orders
和 LineItems
。 虽然大多数订单只有一个订单项,但有些订单可能有多个订单项。 如果存在多个订单项,标准 INNER JOIN
将导致订单行重复。
为了防止出现这种情况,我们将连接限制为每个订单仅第一个 LineItems
行。 这里有两个有效的方法:
使用 CROSS APPLY(SQL Server 2005 及更高版本):
这种方法提供了一个更干净、更易读的解决方案:
<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>
使用带有子查询的内连接(SQL Server 2005 之前版本):
对于较旧的 SQL Server 版本,此方法达到相同的结果:
<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
子句以指定所需的排序条件。
以上是如何将 SQL 连接限制为仅相关表的第一行?的详细内容。更多信息请关注PHP中文网其他相关文章!