Я пытаюсь присоединиться к таблице, которая включает все возможные даты, с таблицей, в которой есть информация для идентификатора на заданную дату, но есть пробелы в датах. Код ниже создаст примеры таблиц.
CREATE TABLE example_info (
info_id varchar(255),
info_date date,
change_in numeric,
min_in numeric,
max_in numeric
);
INSERT INTO example_info (info_id, info_date, change_in, min_in, max_in)
VALUES ('1001-abc', '2020-02-01', '45', '45', '90'),
('1001-abc', '2020-02-03', '40', '50', '90'),
('3007-ghx', '2020-02-02', '10', '30', '40');
CREATE TABLE date_info (
info_id varchar(255),
info_date date
);
INSERT INTO date_info (info_id, info_date)
VALUES ('1001-abc', '2020-02-01'),
('1001-abc', '2020-02-02'),
('1001-abc', '2020-02-03'),
('3007-ghx', '2020-02-01'),
('3007-ghx', '2020-02-02'),
('3007-ghx', '2020-02-03');
Результат левого соединения, который я хочу, будет:
info_id | info_date | change_in | min_in | max_in |
-------------------------------------------------------
1001-abc | 2020-02-01 | 45 | 45 | 90 |
1001-abc | 2020-02-02 | NULL | NULL | NULL |
1001-abc | 2020-02-03 | 40 | 50 | 90 |
3007-ghx | 2020-02-01 | NULL | NULL | NULL |
3007-ghx | 2020-02-02 | 10 | 30 | 40 |
3007-ghx | 2020-02-03 | NULL | NULL | NULL |
Однако использование следующего кода дает следующий результат, и я не понимаю, почему:
SELECT ei."info_id",
di."info_date",
ei."change_in",
ei."min_in",
ei."max_in"
FROM date_info di
LEFT JOIN
example_info ei
ON di."info_id" = ei."info_id"
AND di."info_date" = ei."info_date";
info_id | info_date | change_in | min_in | max_in |
-------------------------------------------------------
1001-abc | 2020-02-01 | 45 | 45 | 90 |
NULL | 2020-02-02 | NULL | NULL | NULL |
1001-abc | 2020-02-03 | 40 | 50 | 90 |
NULL | 2020-02-01 | NULL | NULL | NULL |
3007-ghx | 2020-02-02 | 10 | 30 | 40 |
NULL | 2020-02-03 | NULL | NULL | NULL |
Если вы не говорите нам, чего вы ожидали и почему, ссылаясь на авторитетную документацию в 1-м подвыражении, которое дает вам результат, которого вы не ожидаете, то вы просто просите нас (пере) написать руководство / введение без подробностей о том, что вы уже неправильно понимаете, делаете или не понимаете - несфокусированный вопрос и дубликат того, как работает левое соединение. минимальный воспроизводимый пример включает в себя минимализм и объяснение, это не просто код и не просто какой-то неправильный код. Кроме того, если четко изложить и выразить, это явно будет часто задаваемым вопросом для начинающих. Ожидается исследование.
@JonasMetzler Это правда, что нам дали код, который мы можем вырезать, вставить, запустить и сравнить с желаемым, и это хорошо, но это еще не все, что нужно для минимальный воспроизводимый пример или хорошего вопроса. Смотрите мой комментарий выше. (Также данные не минимальны.)
Почти опечатка, но вы должны выбрать info_id
из таблицы date_info
:
SELECT di.info_id, -- change is here
di.info_date,
ei.change_in,
ei.min_in,
ei.max_in
FROM date_info di
LEFT JOIN example_info ei
ON di.info_id = ei.info_id AND
di.info_date = ei.info_date;
В вашем текущем запросе выбор ei.info
всегда будет null
для тех записей в date_info
, которые не соответствуют ни одной записи в правой таблице соединения.
Вау, это один из лучших описанных вопросов, которые я когда-либо видел здесь, молодец!