У меня громоздкий запрос, который я строю определенным образом, так как я буду вызывать его из C -API, подставляя определенные значения. У меня возникла проблема, когда я ожидаю, что NULL-поля будут заполнять итоговую таблицу.
Чтобы заполнить свой запрос, я генерирую столбец даты, используя рекурсивное табличное выражение и дважды присоединяясь к другой таблице.
Пример набора данных из моей таблицы:
SELECT * FROM myTable;
id foreignId date value
---------- ---------- ---------- ----------
1 1 2019-12-01 100
2 1 2019-12-02 101
3 1 2019-12-03 102
4 1 2019-12-04 103
5 1 2019-12-07 104
6 2 2019-12-01 200
7 2 2019-12-02 201
8 2 2019-12-03 202
9 2 2019-12-07 203
Используемый мной запрос:
WITH RECURSIVE dates(date) AS (
VALUES('2019-12-01')
UNION ALL
SELECT date(date, '+1 day')
FROM dates
WHERE date < '2019-12-07'
)
SELECT a.date, b.myTable, c.myTable
FROM dates a
LEFT JOIN myTable b ON a.date = b.date
LEFT JOIN myTable c ON a.date = c.date
WHERE b.foreignId = 1 AND c.foreignId = 2;
Возвращает таблицу:
date myTable myTable
---------- ---------- ----------
2019-12-01 100 200
2019-12-02 101 201
2019-12-03 102 202
2019-12-07 104 203
Что Я пытаюсь достичь:
date myTable myTable
---------- ---------- ----------
2019-12-01 100 200
2019-12-02 101 201
2019-12-03 102 202
2019-12-04 103
2019-12-05
2019-12-06
2019-12-07 104 203
Я пытался использовать IFNULL в операторе SELECT, например:
...
SELECT a.date, IFNULL(b.myTable, 0) b.myTable, IFNULL(c.myTable, 0) c.myTable
...
, который возвращает:
Error: near ".": syntax error
I ' Я не уверен, что это за синтаксическая ошибка, и эта часть не работает для проверки результата.
Я также пытался использовать CROSS JOIN вместо LEFT JOIN и различных комбинаций, но они возвращают то же самое стол как левое соединение. Кто-нибудь может дать мне какое-то руководство, особенно что-либо в документации, которую я, возможно, пропустил?