SQLite: возвращать пустые поля в нескольких таблицах LEFT JOIN - PullRequest
0 голосов
/ 08 января 2020

У меня громоздкий запрос, который я строю определенным образом, так как я буду вызывать его из 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 и различных комбинаций, но они возвращают то же самое стол как левое соединение. Кто-нибудь может дать мне какое-то руководство, особенно что-либо в документации, которую я, возможно, пропустил?

1 Ответ

0 голосов
/ 08 января 2020

Переместите условие в таблицах left join ed из предложения where в on часть join. В противном случае строки, в которых left join появляется пустым, отфильтровываются предложением where (поскольку условия не выполняются): это фактически превращает ваш left join в inner join.

WITH RECURSIVE dates(date) AS ( ...)
SELECT a.date, b.myTable, c.myTable
FROM dates a
LEFT JOIN myTable b ON a.date = b.date AND b.foreignId = 1
LEFT JOIN myTable c ON a.date = c.date AND c.foreignId = 2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...