sql-server - 使用内部联接的直接查询和使用内部联接包含另一个选择查询有什么区别?
问题描述
我是新来的 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?我们应该使用哪个查询来获得更准确的输出?
谢谢你。
解决方案
它们的意思不同。在您的查询 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
,那么它应该为你升序还是降序排序?
推荐阅读
- qt - Qt Designer 上的禁用布局选项
- javascript - 向下滚动时如何垂直缩小导航栏?
- c# - 刚体组件.速度.y = 0 显然会导致错误(制作乒乓球)
- javascript - Whois 命令的问题
- powershell - Powershell 工厂模式作为静态方法
- selenium - robotsframework + Selenium:如何等到页面重新加载
- maven - 硒/JAVA/MAVEN/詹金斯/文件未发现异常
- avr - Linux:ATtiny1616 的串行引导加载程序应用程序
- swift - 如何制作由 Swift 中的函数返回的 url 发布请求
- java - 单击按钮后无法在 Java Netbeans 中隐藏和取消隐藏 jPanel