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

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

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

提前致谢。

【问题讨论】:

    标签: sql sql-server inner-join


    【解决方案1】:

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

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

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

    .

    【讨论】:

    【解决方案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 的顺序可能是因为聚集索引。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-11
        • 2012-07-16
        • 1970-01-01
        • 1970-01-01
        • 2020-10-18
        • 1970-01-01
        相关资源
        最近更新 更多