首页 > 解决方案 > 使用内部联接的直接查询和使用内部联接包含另一个选择查询有什么区别?

问题描述

我是新来的 sql,我对 sql server 中的这两个查询与内部连接或其他笛卡尔产品感到困惑。

查询一:

SELECT TOP 3
    A.STUDENT_ID,
    A.STUDENT_NAME,
    DOB,
    CGPA,
    B.STUDENT_ID
FROM 
    STUDENT A
INNER JOIN 
    STUDENT_INFO B ON A.STUDENT_NAME = B.STUDENT_NAME
ORDER BY 
    B.STUDENT_ID ASC

查询 2:

SELECT
    A.STUDENT_ID,
    A.STUDENT_NAME,
    DOB,
    CGPA,
    C.STUDENT_ID
FROM 
    STUDENT A
INNER JOIN
    (SELECT TOP 3 * 
     FROM STUDENT_INFO 
     ORDER BY STUDENT_ID) C ON A.STUDENT_NAME = C.STUDENT_NAME

以下是输出(注意student_id):

查询 1 输出:

STUDENT_ID  STUDENT_NAME    DOB                      CGPA   STUDENT_ID
------------------------------------------------------------------------
    4       Laura           1981-12-22 00:00:00.000   3.00    400
   10       Elis            1990-10-28 00:00:00.000   3.00    400
    9       Wise            1987-11-11 00:00:00.000   3.00    499

查询 2 输出

STUDENT_ID  STUDENT_NAME    DOB                      CGPA   STUDENT_ID
------------------------------------------------------------------------
    4       Laura           1981-12-22 00:00:00.000   3.00      400
    9       Wise            1987-11-11 00:00:00.000   3.00      499
   10       Elis            1990-10-28 00:00:00.000   3.00      400

我的问题是,两个连接查询的含义相同(据我理解),但输出是不同的(查询 1 错误,查询 2 正确,按 student_id 升序排列),那么查询 1 和查询2?我们应该使用哪个查询来获得更准确的输出?

谢谢你。

标签: sql-server

解决方案


它们的意思不同。在您的查询 2 中,ORDER BY STUDENT_ID仅对TOP 3您的子查询 C 有效。在子查询中,通常不接受使用 ORDER BY,因为优化器不会在以后加入时保留 ORDER BY。

这不是优化器的愚蠢行为,但他们无法保留 ORDER BY。想象一下,如果你也STUDENT A变成(select top 3 * from STUDENT order by STUDENT_ID desc) A,那么它应该为你升序还是降序排序?


推荐阅读