在 SQL 中仅选择相关表中的第一行
许多数据集包含包含相关表中多个条目的行。 有效地连接这些表需要一种避免数据重复的策略。本文演示了如何仅连接主表中每个条目的相关表的第一行。
挑战:避免重复连接
如果相关表具有单个订单 ID 的多个条目,则简单的联接可能会为每个订单生成多行。我们需要一种方法来仅选择第一个相关行。
无效的方法:TOP 1
陷阱
在内部选择中使用 TOP 1
的天真尝试会失败,因为内部查询无法访问外部表的列(如 OrderID
)。
有效的解决方案:两种行之有效的方法
两种可靠的方法达到了预期的效果:
1。 CROSS APPLY
(SQL Server 2005 及更高版本):
此方法使用 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>
2。 INNER JOIN
(对于 2005 年之前的 SQL Server 版本):
对于较旧的 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
从 LineItems
中仅选择第一个匹配行。 这消除了数据冗余。
确保确定性结果
至关重要的是,如果内部 ORDER BY
语句中没有 SELECT
子句,“第一”行是任意的。 即使数据相同,不同的查询执行也可能返回不同的结果。 始终在内部查询中包含 ORDER BY
子句,以保证结果的一致性和可预测性。 例如:
<code class="language-sql">SELECT TOP 1 LineItems.Quantity, LineItems.Description FROM LineItems WHERE LineItems.OrderID = Orders.OrderID ORDER BY LineItems.SomeColumn -- Add a column to order by</code>
演示这些技术的 SQLfiddle 示例可用(省略链接,因为无法在此处创建实时 SQLfiddle 链接)。 请参阅在线资源以获取实际示例。
以上是如何在 SQL 中高效地连接到相关表的第一行?的详细内容。更多信息请关注PHP中文网其他相关文章!