首页 > 数据库 > mysql教程 > 如何在 SQL 中高效地连接到相关表的第一行?

如何在 SQL 中高效地连接到相关表的第一行?

DDD
发布: 2025-01-17 06:18:09
原创
593 人浏览过

How to Efficiently Join to the First Row of a Related Table in SQL?

在 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 1LineItems 中仅选择第一个匹配行。 这消除了数据冗余。

确保确定性结果

至关重要的是,如果内部 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板