Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/88.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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,我试图从dbo.OrderItems.price中提取价格,该价格与外部查询中调用的相关dbo.Orders.ShipDate关联。我的查询不断抛出一个错误,表示内部查询返回的值超过1 我的问题是如何让内部查询只提取与外部查询所提取内容匹配的值 您需要决定如何组合公司订单上的所有不同价格。我不知道你想要什么。例如,下面返回所有价格的总和: SELECT TOP 100 PERCENT dbo.Customers.Company, MAX(dbo.Orders.ShipDat

我试图从dbo.OrderItems.price中提取价格,该价格与外部查询中调用的相关dbo.Orders.ShipDate关联。我的查询不断抛出一个错误,表示内部查询返回的值超过1


我的问题是如何让内部查询只提取与外部查询所提取内容匹配的值

您需要决定如何组合公司订单上的所有不同价格。我不知道你想要什么。例如,下面返回所有价格的总和:

SELECT TOP 100 PERCENT  
    dbo.Customers.Company, 
    MAX(dbo.Orders.ShipDate) AS Expr1,
    (SELECT dbo.OrderItems.Price FROM dbo.OrderItems) AS Expr2
FROM 
    dbo.Customers
INNER JOIN 
    dbo.Orders ON dbo.Customers.CustomerID = dbo.Orders.CustomerID
INNER JOIN 
    dbo.OrderItems ON dbo.Orders.OrderID = dbo.OrderItems.OrderID
WHERE 
    (dbo.Orders.Deleted = 0)
GROUP BY 
    dbo.OrderItems.InvMasID, dbo.Customers.Company

您需要决定如何组合公司订单上的所有不同价格。我不知道你想要什么。例如,下面返回所有价格的总和:

SELECT TOP 100 PERCENT  
    dbo.Customers.Company, 
    MAX(dbo.Orders.ShipDate) AS Expr1,
    (SELECT dbo.OrderItems.Price FROM dbo.OrderItems) AS Expr2
FROM 
    dbo.Customers
INNER JOIN 
    dbo.Orders ON dbo.Customers.CustomerID = dbo.Orders.CustomerID
INNER JOIN 
    dbo.OrderItems ON dbo.Orders.OrderID = dbo.OrderItems.OrderID
WHERE 
    (dbo.Orders.Deleted = 0)
GROUP BY 
    dbo.OrderItems.InvMasID, dbo.Customers.Company

如果您解释您想要哪个客户订单,以及您想要整个订单价格还是该订单中每个项目的价格,我们可以更具体一些。我不得不做出一些假设,见评论:

SELECT c.Company, MAX(o.ShipDate) AS Latest_ShipDate,
       SUM(oi.Price) AS sum_Price
FROM dbo.Customers c JOIN
     dbo.Orders o
     ON c.CustomerID = o.CustomerID JOIN
     dbo.OrderItems oi
    ON o.OrderID = oi.OrderID
WHERE o.Deleted = 0
GROUP BY oi.InvMasID, c.Company

如果您解释您想要哪个客户订单,以及您想要整个订单价格还是该订单中每个项目的价格,我们可以更具体一些。我不得不做出一些假设,见评论:

SELECT c.Company, MAX(o.ShipDate) AS Latest_ShipDate,
       SUM(oi.Price) AS sum_Price
FROM dbo.Customers c JOIN
     dbo.Orders o
     ON c.CustomerID = o.CustomerID JOIN
     dbo.OrderItems oi
    ON o.OrderID = oi.OrderID
WHERE o.Deleted = 0
GROUP BY oi.InvMasID, c.Company

为什么使用dbo.OrderItems中的SELECT dbo.OrderItems.Price而不是简单的OrderItems.Price?您确实要加入dbo.OrderItems。您还应该发布表的结构,如果您想让我们帮助您,请从dbo.OrderItems中选择dbo.OrderItems.Price。OrderItems将返回OrderItems表中的所有行,因为您没有以任何方式限制它。您需要添加WHERE子句以将其结果集限制为单个记录,该记录绑定到从dbo.Customers处理的当前行。我会考虑使用外部应用而不是子查询,因为它更快、更便宜。另外,dbo.OrderItems.Price是不必要的。在这种情况下,你可以简单地使用价格。删除前100%并忘记它的存在。它没有任何用处。如果您使用它是因为您试图定义一个视图,那么有两个教训需要学习。首先,除非生成结果集的查询包含ORDERBY子句,否则结果集没有定义的顺序。不管行的来源是表、函数、视图等,这都会保持不变。同样,优化器知道100%是一个无意义的表达式,并会忽略它。为什么使用dbo.OrderItems中的SELECT dbo.OrderItems.Price而不是简单的OrderItems.Price?您确实要加入dbo.OrderItems。您还应该发布表的结构,如果您想让我们帮助您,请从dbo.OrderItems中选择dbo.OrderItems.Price。OrderItems将返回OrderItems表中的所有行,因为您没有以任何方式限制它。您需要添加WHERE子句以将其结果集限制为单个记录,该记录绑定到从dbo.Customers处理的当前行。我会考虑使用外部应用而不是子查询,因为它更快、更便宜。另外,dbo.OrderItems.Price是不必要的。在这种情况下,你可以简单地使用价格。删除前100%并忘记它的存在。它没有任何用处。如果您使用它是因为您试图定义一个视图,那么有两个教训需要学习。首先,除非生成结果集的查询包含ORDERBY子句,否则结果集没有定义的顺序。不管行、表、函数、视图等的来源如何,这都是有效的。同样,优化器知道100%是一个无意义的表达式,并忽略它。OP的可能副本应提供InvMasID的解释。我怀疑它特定于一个item参数,该参数将导致此查询产生一些意外结果。OP应该提供InvMasID的解释。我怀疑这是特定于一个item参数的,该参数将导致此查询产生一些意外结果。请注意,两个答案都在表名后添加字母。这称为别名。您可以为表指定一个较短的名称,这样就不会全部键入,然后键入别名,后跟句点,然后键入所需的列。此外,当您按“InvMasID”分组时,这将改变查询的行为。这是什么?另外,SQL SERVER的“现代”版本的“内部联接”现在可以是“联接”。请注意,两个答案都在表名后添加字母。这称为别名。您可以为表指定一个较短的名称,这样就不会全部键入,然后键入别名,后跟句点,然后键入所需的列。此外,当您按“InvMasID”分组时,这将改变查询的行为。这是什么?另外,SQL SERVER的“现代”版本的“内部联接”现在可以是“联接”