Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 非相关和相关嵌套语句之间的区别是什么?_Sql_Sql Server - Fatal编程技术网

Sql 非相关和相关嵌套语句之间的区别是什么?

Sql 非相关和相关嵌套语句之间的区别是什么?,sql,sql-server,Sql,Sql Server,我对非相关和相关嵌套select语句之间的区别感到困惑?我是一名学生,我正在努力创建一个相关的语句,但我不确定我是否做得正确 SELECT P.Firstname AS First, P.Lastname AS Last, AVG(C.grade) AS Cgpa FROM Person P, Class C WHERE P.stdNo = (SELECT S.stdNo FROM School S WHERE S.No = C

我对非相关和相关嵌套select语句之间的区别感到困惑?我是一名学生,我正在努力创建一个相关的语句,但我不确定我是否做得正确

SELECT P.Firstname  AS First, 
   P.Lastname   AS Last, 
   AVG(C.grade) AS Cgpa
FROM   Person P, 
       Class C 
WHERE  P.stdNo = (SELECT S.stdNo
    FROM   School S
    WHERE  S.No = C.No)
    GROUP BY P.LastName , P.FirstName
    ORDER BY P.LastName
这目前不起作用。我收到此错误“子查询返回的值超过1。当子查询后跟=、!=、=或子查询用作表达式时,不允许出现此错误。”


编辑代码:这是一个相关的选择状态吗?

首先,让我们来处理您的特定问题。使用子查询时,必须注意其上下文。有两种上下文:表和标量。在表上下文中,子查询应返回一组行。在标量上下文中,它需要返回单个值(一行一列)。你怎么知道哪个是哪个?表上下文将由以下结构表示:

FROM (...)
JOIN (...)
WHERE ... IN(...)
而标量上下文或多或少是在其他任何地方。如果将子查询的结果与单个值(如where子句中的列)进行比较,或者将结果用作选择字段列表中的计算列,则子查询处于标量上下文中

在特定查询中,将子查询的结果与NULL进行比较。因为NULL是一个单一的值,所以我们讨论的是标量上下文。因此,子查询需要返回单个结果。你的学校不是,这可能是因为一个人所属的学校很多。不管怎样我想我能猜出你打算做什么。您希望只包括至少属于一所学校的人员。您可以这样更有效地编写:

WHERE EXISTS(SELECT * FROM School S WHERE P.stdNo = S.stdNo)
您可以用列或表达式替换
*
。这其实并不重要,因为
EXISTS()
测试是否返回了任何行,并且对特定的结果不做任何处理

不过,您还有一个更大的问题,那个就是您正在做Person表和Class表的笛卡尔乘积。我假设你真的想以某种方式将人与类相匹配。因为很容易意外地使用逗号运算符进行笛卡尔连接,所以我总是使用并推荐显式
join
运算符。如果在没有指定连接谓词的情况下说
内部连接
(或其他类型),将出现语法错误。所以你应该有这样的东西:

FROM Person P
JOIN Class C
  ON <condition>
来自个人P
加入C类
在…上

现在,关于独立子查询和相关子查询的另一个问题。独立子查询是最简单的情况。它是一个子查询,不引用查询中在其外部使用的任何表或列。相关子查询引用在其外部使用的表或列。子查询是相关的,因为它引用了
P.stdNo
,它包含在子查询之外的查询中。关联子查询必须在逻辑上对其所包含的上下文中的每一行执行。在您的例子中,WHERE子句检查的每一行都会导致子查询的逻辑执行,使用来自该特定行的数据(在本例中为
P.stdNo
)。出于明显的原因,独立子查询只需在逻辑上执行一次。

您是在谈论相关子查询还是独立子查询?我从来没有听说过这种类型I/类型II的东西……是的,我相信类型II被称为相关或可变嵌套查询+1,因为文本量很大,尽管你可以用几句话来回答这个问题。@Bohemian:看起来OP在理解一些概念时有点困难,所以我认为应该有一个更彻底的解释。