在内部连接中排序

Posted

技术标签:

【中文标题】在内部连接中排序【英文标题】:Order by in Inner Join 【发布时间】:2011-05-03 10:58:26 【问题描述】:

我在我的查询中加入了内连接。我得到了结果,但不知道数据是如何输出的。谁能告诉我内连接如何匹配数据。下面我展示了一张图片.有两个表(一个或两个表)。

根据我的说法,第一行应该是 Mohit,但输出不同。请告诉我。

提前致谢。

【问题讨论】:

【参考方案1】:

我在加入时发现这是一个问题,但您可能会发现此博客有助于了解联接在后面的工作原理。 How Joins Work..

[已编辑] @Shree 感谢您指出这一点。 关于 Merge Join 的段落。它提到了连接是如何工作的......

喜欢 hash join、merge join由两步组成。首先,这两个表 join 是按 join 属性排序的。只需两个即可完成 通过外部合并排序遍历每个表。最后, 结果元组在下一个有序元素被拉出时生成 比较每个表和连接属性

.

【讨论】:

Muzamir,虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。 Answers that are little more than a link may be deleted.【参考方案2】:

如果您希望数据以某种方式返回,则必须对其进行排序。当您说您希望“Mohit”成为第一行时,我假设您这么说是因为“Mohit”是[One] 表中的第一行。但是,当 SQL Server 连接表时,它不一定按照您认为的顺序连接。

如果您希望返回[One] 的第一行,请尝试按[One].[ID] 排序。或者,您可以order by 任何其他列。

【讨论】:

感谢回复。我知道order by 但是我想知道Inner join在内部是如何工作的? 当您执行 INNER JOIN 时,SQL Server 会确定查找匹配行的最佳方法(嵌套循环等)。这会导致结果的随机排序。 任何人都知道我是否可以强制(特别是对于 SQLite)“有序”连接?【参考方案3】:

在您的主查询中避免使用SELECT *

避免重复列:JOIN 条件可确保 One.One_Nametwo.One_Name 相等,因此您无需在 SELECT 子句中返回两者。

避免列名重复:使用“别名”重命名 One.IDTwo.ID

使用SELECT 子句中的列名(“别名”,如果适用)添加一个ORDER BY 子句。

建议重写:

SELECT T1.ID AS One_ID, T1.One_Name, 
       T2.ID AS Two_ID, T2.Two_name
  FROM One AS T1
       INNER JOIN two AS T2
          ON T1.One_Name = T2.One_Name
 ORDER 
    BY One_ID;

【讨论】:

【参考方案4】:

默认情况下,SQL 不返回任何排序,因为这样更快。它不必先检查您的数据,然后再决定要做什么。

您需要添加一个 order by 子句,并且可能按您期望的任何 ID 进行排序。 (名称重复,因此我假设您需要 One.ID)

select * From one
inner join two
ON one.one_name = two.one_name
ORDER BY one.ID

【讨论】:

【参考方案5】:

SQL 中,除非您在ORDER BY 子句中指定,否则未定义输出顺序。

试试这个:

SELECT  *
FROM    one
JOIN    two
ON      one.one_name = two.one_name
ORDER BY
        one.id

【讨论】:

+1:使用ORDER BY 子句,顺序不太可能是随机的,并且可能是可预测的(给定足够的信息),但重点是“未定义输出”。 感谢回复。我知道order by 但是我想知道Inner join在内部是如何工作的? 为您的查询构建计划(只需在查询窗口中按Ctrl-L),它将显示算法。【参考方案6】:

在您的第一个查询末尾添加ORDER BY ONE.ID ASC

默认情况下没有排序。

【讨论】:

但是当从表中选择记录时默认顺序是“ASC” 感谢回复。我知道order by 但是我想知道Inner join在内部是如何工作的? @Mohit - 一旦你执行JOIN,就没有自然顺序。你得到的结果是正确的,但无序。您的单个表SELECT 的顺序可能是因为聚集索引。

以上是关于在内部连接中排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在内部连接 ​​Laravel 5 上 ->paginate()

MongoDB查询处理/获取内部数组(需要在内部数组中应用分页)

如何在内部函数中使用类变量?

在内部函数内部分配外部变量的python闭包

我可以在内部连接条件 sql 中使用子查询吗

在内部连接多个表时,我可以使用啥其他方法来选择 *?