【发布时间】:2011-05-03 10:58:26
【问题描述】:
我在我的查询中加入了内连接。我得到了结果,但不知道数据是如何输出的。谁能告诉我内连接如何匹配数据。下面我展示了一张图片.有两个表(一个或两个表)。
根据我的说法,第一行应该是 Mohit,但输出不同。请告诉我。
提前致谢。
【问题讨论】:
标签: sql sql-server inner-join
我在我的查询中加入了内连接。我得到了结果,但不知道数据是如何输出的。谁能告诉我内连接如何匹配数据。下面我展示了一张图片.有两个表(一个或两个表)。
根据我的说法,第一行应该是 Mohit,但输出不同。请告诉我。
提前致谢。
【问题讨论】:
标签: sql sql-server inner-join
我在加入时发现这是一个问题,但您可能会发现此博客有助于了解联接在后面的工作原理。 How Joins Work..
[已编辑] @Shree 感谢您指出这一点。 关于 Merge Join 的段落。它提到了连接是如何工作的......
喜欢 hash join、merge join由两步组成。首先,这两个表 join 是按 join 属性排序的。只需两个即可完成 通过外部合并排序遍历每个表。最后, 结果元组在下一个有序元素被拉出时生成 比较每个表和连接属性
.
【讨论】:
如果您希望数据以某种方式返回,则必须对其进行排序。当您说您希望“Mohit”成为第一行时,我假设您这么说是因为“Mohit”是[One] 表中的第一行。但是,当 SQL Server 连接表时,它不一定按照您认为的顺序连接。
如果您希望返回[One] 的第一行,请尝试按[One].[ID] 排序。或者,您可以order by 任何其他列。
【讨论】:
在您的主查询中避免使用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;
【讨论】:
默认情况下,SQL 不返回任何排序,因为这样更快。它不必先检查您的数据,然后再决定要做什么。
您需要添加一个 order by 子句,并且可能按您期望的任何 ID 进行排序。 (名称重复,因此我假设您需要 One.ID)
select * From one
inner join two
ON one.one_name = two.one_name
ORDER BY one.ID
【讨论】:
在SQL 中,除非您在ORDER BY 子句中指定,否则未定义输出顺序。
试试这个:
SELECT *
FROM one
JOIN two
ON one.one_name = two.one_name
ORDER BY
one.id
【讨论】:
ORDER BY 子句,顺序不太可能是随机的,并且可能是可预测的(给定足够的信息),但重点是“未定义输出”。
Ctrl-L),它将显示算法。
在您的第一个查询末尾添加ORDER BY ONE.ID ASC。
默认情况下没有排序。
【讨论】:
JOIN,就没有自然顺序。你得到的结果是正确的,但无序。您的单个表SELECT 的顺序可能是因为聚集索引。