【问题标题】:Select all product's last price and if null set to 0选择所有产品的最后价格,如果 null 设置为 0
【发布时间】:2021-03-03 01:17:08
【问题描述】:

我有 2 个表格(“产品”和“价格”)

这些是表格:

-------------
| Products  |
-------------
| ProdID    |
| ProdName  |
-------------

-------------
| Prices    |
-------------
|     ID    |
| EnDate    |
|ProdID     |
|Price      |
-------------

我想要的是选择 Products Table 中所有具有最新价格的 Products Table 中的 1 个条件:

  • 如果在价格表中找不到 prodID,则用 0 填充。

我只知道如何从价格表中选择最新价格,但我不知道如何选择所有产品,即使尚未在价格表中找到

这是我到目前为止所做的:

SELECT  a.*
FROM    Prices a 
        INNER JOIN
        (
            SELECT  ProdID, MAX(EnDate) max_date
            FROM     Prices         
            GROUP   BY ProdID
        ) b ON  a.ProdID = b.ProdID AND
                a.EnDate = b.max_date

感谢您的帮助。

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    我建议为此使用outer apply

    select pr.*, coalesce(pi.price, 0) as price
    from products pr outer apply
         (select top (1) pi.*
          from prices pi
          where pi.prodId = pr.prodId
          order by pi.EnDate desc
         ) pi;
    

    在这种情况下,outer apply 实际上只是一个相关子查询。一般来说,apply 实现了横向连接,它是相关子查询的扩展——非常强大,通常是表达特定逻辑的最有效方式。

    【讨论】:

    • 您好,感谢您的快速回复,我尝试了您的查询,它就像一个魅力!非常感谢。
    • 请注意,标量聚合(没有group by)可以使用cross apply,因为它们总是返回结果。矢量聚合(在本例中为 group by ())必须使用 outer apply 来强制执行 left join 语义
    猜你喜欢
    • 1970-01-01
    • 2013-01-14
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多