无法理解此查询的逻辑

时间:2019-08-14 08:07:17

标签: sql sql-server tsql

此查询试图获取每个s1ppmp(大小),每个s1ilie(参考)和s1iref(最后一个)的s1ydat(产品价格)日期),因为一种产品在不同的日期(例如,黑色星期五或其他日期的正常价格)可能具有多个价格。

anmoisjour来自日历表,但是CALENDER表和主表msk100之间没有连接,所以...我不了解此查询的逻辑...

SELECT s1isoc,
       s1ilie,
       s1iref,
       s1ydat,
       anmoisjour,
       s1ppmp
FROM msk110
     INNER JOIN (SELECT s1isoc AS isoc,
                        s1ilie AS ilie,
                        s1iref AS iref,
                        MAX(s1ydat) AS ydat,
                        anmoisjour
                 FROM calendrier,
                      msk110
                 WHERE s1ydat <= anmoisjour
                   AND anmoisjour BETWEEN 20100101 AND 20302131
                 GROUP BY s1isoc,
                          s1ilie,
                          s1iref,
                          anmoisjour) a ON s1isoc = isoc
                                       AND s1ilie = ilie
                                       AND s1iref = iref
                                       AND s1ydat = ydat
WHERE s1isoc = 1
  AND anmoisjour BETWEEN 20100101 AND 20302131
ORDER BY anmoisjour,
         s1ydat;

s1isoc,s1ilie,s1iref,s1ydat和s1ppmp来自msk110 和 anmoisjour属于日历表,它是日期表。

1 个答案:

答案 0 :(得分:2)

我相信混淆是日历表连接的方式。

如果anmoisjour是日历表的天列,并且该表每天保留1行,则WHERE过滤器anmoisjour BETWEEN 20100101 AND 20302131使calendrier每天保留一行为期20年(2010年至2030年)。

它们将产品价格表msk100链接到日历calendrier表的方式不是直接按日期,而是带有最大日期(msk100.s1ydat <= calendrier.anmoisjour)。这意味着,例如msk100.s1ydat的日期2015-01-01将与日历表{strong> 2015-01-01

2030-12-31以日历表的日期(GROUP BY表示),这意味着如果特定产品,尺寸和价格在不同的日期重复,则可以说唯一的出现在日期{{1} },calendrier.anmoisjour2015-01-01,则分组依据的结果如下(按日历日期排序,甚至显示2017-01-01进行演示)

2020-01-01

查询所显示的是产品表 的内容,以及该特定产品具有该特定价格的最后日期 ,该日期也超过20年NULL的位置(我不知道那是什么意思)。