SQL:嵌套子查询与set操作

时间:2013-12-31 01:54:16

标签: sql sql-server

我是否正确地说明大多数嵌套子查询可以与unionintersect等集合运算符互换,因为它们会给出相同的结果。问我发现集合运算符更容易使用,并且更愿意在我即将开始的考试中使用嵌套子查询。

E.g。

SELECT DISTINCT course id
  FROM section
 WHERE     semester = ’Fall’
       AND year = 2009
       AND courseid IN (SELECT course id
                          FROM section
                         WHERE semester = ’Spring’ AND year = 2010);

得到的结果如下:

(SELECT course id
   FROM section
  WHERE semester = ’Fall’ AND year = 2009)
INTERSECT
(SELECT course id
   FROM section
  WHERE semester = ’Spring’ AND year = 2010);

2 个答案:

答案 0 :(得分:0)

选择编码方法完全取决于组织中遵循的编码实践。虽然他们中的大多数已经定义了关于编码的指导方针,但他们通常会根据个人喜好让开发人员选择您的案例。因此,只要查询给出正确的结果,没有人会打扰你是否使用了集合运算符或子查询。

还有一种编写代码的方法,您似乎忽略或忘记了这些方法。您可以使用连接并进一步最小化代码行。它将如下:

SELECT DISTINCT s1.course_id
  FROM section s1 INNER JOIN section s2 ON s1.courseid = s2.courseid
 WHERE     s1.semester = 'Fall'
       AND s2.semester = 'Spring'
       AND s1.year = 2009
       AND s2.year = 2010;

此外,正如Szymon在上面的评论中提到的,子查询具有更广泛的用途。其中一个是相关子查询。子查询的另一个很好用途是内联视图。谷歌他们两个并尝试在你的工作中应用这些概念(如果你不是仅仅为大学作业而是为了学习编码)。

答案 1 :(得分:0)

我对我自己的一些数据进行了快速检查,只是为了验证和使用你的两个例子,我得到了相同的结果,至少在这些例子的范围内,确认它们是相同的。

为了考试,我认为你没事。

然而,在现实世界中,这两个陈述通常会产生不同的执行计划。编写关于这些的具体建议有点困难,因为表格设计和数据大小在所有系统之间都是不同的。但是,虽然您可能会觉得这些结果返回相同的结果,但它有点类似于:

SELECT * FROM mytable

VS

Select column1, column2, column3 FROM mytable

对于第一个那里,性能(和执行计划)对于数据量很少的小表可能是相同的,但随着它的增长,你将开始通过写短手来节省几秒钟的成本代码。

如果你四处搜索,你会发现有INTERSECT性能问题的人;我没有看到任何人在INTERSECT上表现出比使用子查询替代品更好的表现。