ЛЕВОЕ СОЕДИНЕНИЕ с разделенным подзапросом с предложением WHERE не может использовать столбец верхнего уровня

#mysql #mariadb #left-join

Вопрос:

Следующий запрос должен возвращать самые новые макеты для всех магазинов, которые новее текущей календарной недели (year_week):

 SELECT 
  year_weeks.id,
  year_weeks.week,
  `frame_group_layouts`.`id` AS fgl_id
FROM `year_weeks`
LEFT JOIN `frame_group_layouts` ON `frame_group_layouts`.`id` IN (
  SELECT FIRST_VALUE(`frame_group_layouts`.`id`) OVER(
    PARTITION BY store_id
    ORDER BY year_week_id DESC
  )
  FROM
    frame_group_layouts
  WHERE
    year_week_id <= year_weeks.id
    AND edit_of_id IS NULL
    AND frame_group_layout_type = 'template'
)
WHERE `year_weeks`.`year` = 2021
 

Ожидаемым результатом будет Список со всеми календарными неделями на 2021 год, с:

  1. fgl_id равен НУЛЮ, если нет магазина с макетом старше или равным текущей неделе
  2. fgl_id, установленный с макетом

Фактический результат заключается в следующем:

  -------- ------ ------ 
| id     | week | id   |
 -------- ------ ------ 
| 202101 |    1 | NULL |
| 202102 |    2 | NULL |
| 202103 |    3 | NULL |
| 202104 |    4 | NULL |
| 202105 |    5 | NULL |
| 202106 |    6 | NULL |
| 202107 |    7 | NULL |
| 202108 |    8 | NULL |
| 202109 |    9 | NULL |
| 202110 |   10 | NULL |
| 202111 |   11 | NULL |
| 202112 |   12 | NULL |
| 202113 |   13 | NULL |
...
 

даже если макет существует.

Если я установлю year_week.идентификатор в предложении WHERE подзапроса вручную, запрос возвращает правильный результат (но только для данной недели):

 MariaDB [denner_xpt_core]> SELECT 
    ->   year_weeks.id,
    ->   year_weeks.week,
    ->   `frame_group_layouts`.`id`
    -> FROM `year_weeks`
    -> LEFT JOIN `frame_group_layouts` ON `frame_group_layouts`.`id` IN (
    ->   SELECT FIRST_VALUE(`frame_group_layouts`.`id`) OVER(
    ->     PARTITION BY store_id
    ->     ORDER BY year_week_id DESC
    ->   )
    ->   FROM
    ->     frame_group_layouts
    ->   WHERE
HERE->     year_week_id <= 202135
    ->     AND edit_of_id IS NULL
    ->     AND frame_group_layout_type = 'template'
    -> )
    -> WHERE `year_weeks`.`year` = 2021;
 -------- ------ ------- 
| id     | week | id    |
 -------- ------ ------- 
| 202101 |    1 | 11136 |
| 202102 |    2 | 11136 |
| 202103 |    3 | 11136 |
| 202104 |    4 | 11136 |
| 202105 |    5 | 11136 |
| 202106 |    6 | 11136 |
| 202107 |    7 | 11136 |
| 202108 |    8 | 11136 |
| 202109 |    9 | 11136 |
| 202110 |   10 | 11136 |
| 202111 |   11 | 11136 |
| 202112 |   12 | 11136 |
| 202113 |   13 | 11136 |
| 202114 |   14 | 11136 |
| 202115 |   15 | 11136 |
| 202116 |   16 | 11136 |
| 202117 |   17 | 11136 |
| 202118 |   18 | 11136 |
| 202119 |   19 | 11136 |
| 202120 |   20 | 11136 |
| 202121 |   21 | 11136 |
| 202122 |   22 | 11136 |
| 202123 |   23 | 11136 |
| 202124 |   24 | 11136 |
| 202125 |   25 | 11136 |
| 202126 |   26 | 11136 |
| 202127 |   27 | 11136 |
| 202128 |   28 | 11136 |
| 202129 |   29 | 11136 |
| 202130 |   30 | 11136 |
| 202131 |   31 | 11136 |
| 202132 |   32 | 11136 |
| 202133 |   33 | 11136 |
| 202134 |   34 | 11136 |
| 202135 |   35 | 11136 |
| 202136 |   36 | 11136 |
| 202137 |   37 | 11136 |
| 202138 |   38 | 11136 |
| 202139 |   39 | 11136 |
| 202140 |   40 | 11136 |
| 202141 |   41 | 11136 |
| 202142 |   42 | 11136 |
| 202143 |   43 | 11136 |
| 202144 |   44 | 11136 |
| 202145 |   45 | 11136 |
| 202146 |   46 | 11136 |
| 202147 |   47 | 11136 |
| 202148 |   48 | 11136 |
| 202149 |   49 | 11136 |
| 202150 |   50 | 11136 |
| 202151 |   51 | 11136 |
| 202152 |   52 | 11136 |
| 202101 |    1 | 11138 |
| 202102 |    2 | 11138 |
| 202103 |    3 | 11138 |
| 202104 |    4 | 11138 |
| 202105 |    5 | 11138 |
| 202106 |    6 | 11138 |
| 202107 |    7 | 11138 |
| 202108 |    8 | 11138 |
| 202109 |    9 | 11138 |
| 202110 |   10 | 11138 |
| 202111 |   11 | 11138 |
| 202112 |   12 | 11138 |
| 202113 |   13 | 11138 |
| 202114 |   14 | 11138 |
| 202115 |   15 | 11138 |
| 202116 |   16 | 11138 |
| 202117 |   17 | 11138 |
| 202118 |   18 | 11138 |
| 202119 |   19 | 11138 |
| 202120 |   20 | 11138 |
| 202121 |   21 | 11138 |
| 202122 |   22 | 11138 |
| 202123 |   23 | 11138 |
| 202124 |   24 | 11138 |
| 202125 |   25 | 11138 |
| 202126 |   26 | 11138 |
| 202127 |   27 | 11138 |
| 202128 |   28 | 11138 |
| 202129 |   29 | 11138 |
| 202130 |   30 | 11138 |
| 202131 |   31 | 11138 |
| 202132 |   32 | 11138 |
| 202133 |   33 | 11138 |
| 202134 |   34 | 11138 |
| 202135 |   35 | 11138 |
| 202136 |   36 | 11138 |
| 202137 |   37 | 11138 |
| 202138 |   38 | 11138 |
| 202139 |   39 | 11138 |
| 202140 |   40 | 11138 |
| 202141 |   41 | 11138 |
| 202142 |   42 | 11138 |
| 202143 |   43 | 11138 |
| 202144 |   44 | 11138 |
| 202145 |   45 | 11138 |
| 202146 |   46 | 11138 |
| 202147 |   47 | 11138 |
| 202148 |   48 | 11138 |
| 202149 |   49 | 11138 |
| 202150 |   50 | 11138 |
| 202151 |   51 | 11138 |
| 202152 |   52 | 11138 |
 -------- ------ ------- 
104 rows in set (0.001 sec)
 

Вы можете попробовать это здесь: https://dbfiddle.uk/?rdbms=mariadb_10.4amp;fiddle=5271cb1f0117974a364f51a88e1a197c
Что я делаю не так?