如何比较SQL中的行与子查询输出?

时间:2015-05-08 05:24:26

标签: sql sql-server database tsql

有两个表,OrderID和Order Details。

订单:

OrderID PK
Freight
|....|

订单明细:

OrderID PK FK
ProductID PK FK
UnitPrice
Quantity
|....|

每个OrderID对于Orders都是唯一的,但订单明细可以包含相同OrderID和不同ProductIdUnitPrice等的若干详细信息。

因此,在订单明细中,我们可以看到两个,三个或更多订单(OrderID)。

我的任务是选择所有运费记录的实际地址,其超过整个订单运费的总成本> UnitPrice * Quantity *(订单明细中的OrderID数量)

SELECT %%physloc%%
FROM Orders
WHERE Freight > (SELECT SUM(UnitPrice * Quantity)
                 FROM [Order Details]
                 GROUP BY OrderID);

当然,我有

  

'子查询返回的值超过1个......'

我尝试使用Top但在这种情况下我的选择错误。

我需要的只是比较每个Freight与OrderID记录以及来自该子查询的每个记录具有相同的OrderID。但我不知道怎么做。

也许有人可以找到不同的方式,这会很棒。

我使用SQL Server 2008

谢谢大家。

3 个答案:

答案 0 :(得分:1)

最简单的思考方法如下:

  1. 外部查询处理Orders表中的每条记录。发生这种情况时,当前的OrderID与子查询共享。这可以通过子查询"其中"声明。这将确保在子查询中求和的数据具有相同的OrderID。

  2. 使用别名使得引用表比指定每个表及其相应列的全名更容易。格式:tableName.Column例如Orders.OrderID。更容易的替代别名.Column例如o.OrderID在哪里" o"被定义为Orders的别名。

  3. SELECT %%physloc%%
    FROM Orders o
    WHERE Freight > (SELECT SUM(UnitPrice * Quantity)
                     FROM [Order Details] od
                     WHERE od.OrderID = o.OrderID
        GROUP BY OrderID);
    

答案 1 :(得分:1)

  

我的任务是选择所有运费记录的实际地址,其超过整个订单运费的总成本> UnitPrice * Quantity *(订单明细中的OrderID数量)

您可以通过使用别名并按以下方式过滤子查询来轻松实现...

SELECT %%physloc%%
FROM Orders o
WHERE o.Freight > (SELECT SUM(od.UnitPrice * od.Quantity)
                 FROM [Order Details] as od
                 WHERE od.OrderId = o.OrderId);

您根本不需要group by条款,因为它可能会对结果进行拆分/分组。通过使用sum聚合函数,您已经返回了一个标量值,可以通过where子句进一步过滤

答案 2 :(得分:1)

您应该加入要使用的查询。

SELECT 
    *
FROM Orders as o
INNER JOIN (SELECT od.OrderId, SUM(od.UnitPrice * od.Quantity) as Total
            FROM Details as od
            GROUP BY od.OrderId) as d ON d.orderId = o.Id
WHERE o.Freight > d.Total;

http://sqlfiddle.com/#!6/a151f/6

编辑:

另请注意,您将OrderId作为Orders表的主键,这通常是外键的注释。