在内部连接中排序
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_Name
和 two.One_Name
相等,因此您无需在 SELECT
子句中返回两者。
避免列名重复:使用“别名”重命名 One.ID
和 Two.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()