【问题标题】:How to compare row with subquery output in SQL?如何在 SQL 中将行与子查询输出进行比较?
【发布时间】:2015-05-08 05:24:26
【问题描述】:

有两个表,OrderID 和 Order Details。

订单:

OrderID PK
Freight
|....|

订单详情:

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

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

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

我的任务是选择所有运费记录的物理地址,这些记录超过整个订单运费的总成本 > 单价 * 数量 *(订单详细信息中的 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

谢谢大家。

【问题讨论】:

    标签: sql sql-server database tsql


    【解决方案1】:

    我的任务是选择所有运费记录的物理地址,这些记录超过整个订单运费的总成本 > 单价 * 数量 *(订单详细信息中的 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】:

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

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

    【讨论】:

    • 代码需要稍作调整才能与 OP 数据方案保持一致 o.id 应切换为 o.orderid
    • 嗯,当然,但我认为表的主键不应该像 FK 一样命名。因此在 Orders 表中使用 Id 而不是 OrderId。
    • 谢谢你,你的方式告诉我如何思考一点不同 =)
    【解决方案3】:

    最简单的流程思路如下:

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

    2. 别名的使用使得引用表比必须指定每个表的全名及其对应列更容易。格式:tableName.Column 例如Orders.OrderID。更简单的替代 alias.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);
    

    【讨论】:

    • 非常有帮助,非常感谢。我知道别名,但在我的问题中的代码中,我只是不觉得别名是必要的。不过,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多