首页 文章

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

提问于
浏览
3

有两个表,OrderID和Order Details .

命令:

OrderID PK
Freight
|....|

订单详细信息:

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

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

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

我的任务是选择超过整个订单总成本的所有货运记录的实际地址运费>单位价格数量(订单明细中订单ID的数量)

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 回答

  • 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表的主键,这通常是外键的注释 .

  • 1

    最简单的思考方法如下:

    • 外部查询处理Orders表中的每条记录 . 发生这种情况时,当前的OrderID与子查询共享 . 这可以通过子查询的“where”语句实现 . 这将确保子查询中汇总的数据具有相同的OrderID .

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


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

    我的任务是选择超过整个订单总成本的所有货运记录的实际地址运费>单位价格数量(订单明细中的订单ID数量)

    您可以通过使用别名并以下列方式过滤子查询来轻松实现这一目标...

    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 子句进一步过滤

相关问题