zoukankan      html  css  js  c++  java
  • [SQL]1164 又是被主键坑了的一天

    1164. 指定日期的产品价格

    之前一直不知道主键是干啥的,读题就总选择性忽略了主键,然后今天这个题,给我上了生动的一课...

    思路很简单,关键是要选出每个产品2019-08-16之前最大日期,以及它对应的产品id及价格。大概就是创造一个这个样子的临时表。

    然后我写出了这样子的代码。

    SELECT product_id, MAX(change_date) AS date
    FROM Products 
    WHERE change_date <= '2019-08-16'
    GROUP BY product_id
    

    然后发现,我的临时表为什么总是这个样子。

    也就是说,他的价格和日期没有对应上!!

    看了别人的答案,我才发现主键的重要性。

    直到我的代码变成:

    SELECT product_id, new_price
    FROM Products
    WHERE (product_id, change_date) IN (SELECT product_id, MAX(change_date) AS date
                                        FROM Products 
                                        WHERE change_date <= '2019-08-16'
                                        GROUP BY product_id)
    

    他才乖乖听话给我对应上了。

    其实上上篇博客没有解决的问题,也是出在这里了。

    行了我知道主键不是写着好看的了。

    SELECT t1.product_id, IFNULL(new_price, 10) AS price
    FROM (SELECT DISTINCT product_id FROM Products) t1 LEFT JOIN
    (SELECT product_id, new_price
    FROM Products
    WHERE (product_id, change_date) IN (SELECT product_id, MAX(change_date) AS date
                                        FROM Products 
                                        WHERE change_date <= '2019-08-16'
                                        GROUP BY product_id) ) t2
    ON t1.product_id = t2.product_id;
    
  • 相关阅读:
    愚蠢的程序员...
    云计算优于终端计算和集中计算?
    REST资源合集
    龙芯软件开发:使用龙芯2e的模拟器GXemul
    The Origins of Complex Numbers
    net 3.5 Ms Chart 使用心得
    XPO 第三方控件学习(DevExpress Persistent Object )系列表间关系
    show your data
    缩略数据
    单片机试题
  • 原文地址:https://www.cnblogs.com/wyz-2020/p/12713277.html
Copyright © 2011-2022 走看看