WHERE单独工作后的子查询,但不作为子查询

时间:2016-10-17 08:53:57

标签: sql sql-server

USE [AdventureWorks2014]
GO

SELECT PERSON.FirstName, PERSON.LastName, SP.*
FROM [Person].[Person] PERSON, [Sales].[SalesPerson] SP
WHERE (SELECT TotalDue
    FROM Sales.SalesOrderHeader) >
    (SELECT AVG(TotalDue)
    FROM Sales.SalesOrderHeader);

如果我运行这个,我收到错误:

  

子查询返回的值超过1。这是不允许的   子查询跟随=,!=,<,< =,>,> =或当子查询用作   表达。

但是,如果我删除" GO"之间的所有内容。和WHERE(也删除第一组括号),查询运行正常,并给我一个超过4000的答案。(这听起来对我来说。)

我是新手,所以这真的是踢我的屁股。我只知道我错过了一些非常简单的东西,但我现在看不到它,而且我已经和它斗争了很长时间以至于我的大脑已经变得糊里糊涂了。 (顺便说一句,运行SQL Server Express 2014,如果事实证明这很重要的话。)

编辑:根据Ted的评论,让我重新解释一下这个问题,现在我已经明显更加清醒了,还说我正在寻找指导,而不是有人为我写这个因为如果你们为我做这件事,我什么都学不到。

我使用Microsoft提供的用于SQL Server的AdventureWorks数据库已有多年。我需要从Person.Person表中检索名字和姓氏,以及Sales.Salesperson表中的所有信息。但是,我想要显示的唯一值是Sales.SalesOrderHeader.TotalDue列中的金额大于整个Sales.SalesOrderHeader.TotalDue列的平均值。 Person.Person和Sales.SalesPerson共享BusinessEntityID键,TerritoryID在Sales.SalesOrderHeader和Sales.SalesPerson之间共享。如果我使用任何类型的JOIN,它会进入无限循环,我必须手动停止。

如果我注释掉外部查询,查询将返回4012的答案。但是我从那以后所做的所有尝试都会使这些数据影响我的外连接,或者抛出各种错误信息或无限循环。

如果需要有关此问题的更多信息,请告诉我 - 我正在尝试学习SQL以及如何正确地提出问题。 (不要惹恼Ted,这是一个附带好处。)

3 个答案:

答案 0 :(得分:1)

在下面的陈述中:

(SELECT TotalDue FROM Sales.SalesOrderHeader) 
> 
(SELECT AVG(TotalDue) FROM Sales.SalesOrderHeader);

(SELECT TotalDue FROM Sales.SalesOrderHeader)可能会返回多行,而(SELECT AVG(TotalDue) FROM Sales.SalesOrderHeader)将始终返回一行。

您无法使用>运算符与1进行比较。

也许您的意思是使用maxmin

(SELECT MAX(TotalDue) FROM Sales.SalesOrderHeader) 
> 
(SELECT AVG(TotalDue) FROM Sales.SalesOrderHeader);

答案 1 :(得分:0)

您的子查询返回多个结果,这意味着它无法直接与任何内容进行比较。

要解决这个问题(虽然它可能不会如你所愿):

{{1}}

答案 2 :(得分:0)

我认为@Ted的回答描述了您的查询的问题,这是我对您可能希望查询执行的操作的猜测:

SELECT PERSON.FirstName, PERSON.LastName, SP.*
  FROM [Person].[Person] PERSON, [Sales].[SalesPerson] SP
 WHERE EXISTS ( SELECT 'true'
                  FROM Sales.SalesOrderHeader
                 HAVING MAX(TotalDue) > AVG(TotalDue) );