Почему я получаю нулевые значения для сопоставленных переменных в ЛЕВОМ СОЕДИНЕНИИ в SQL?

Я пытаюсь присоединиться к таблице, которая включает все возможные даты, с таблицей, в которой есть информация для идентификатора на заданную дату, но есть пробелы в датах. Код ниже создаст примеры таблиц.

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 |

Вау, это один из лучших описанных вопросов, которые я когда-либо видел здесь, молодец!

Jonas Metzler 16.05.2022 16:24

Если вы не говорите нам, чего вы ожидали и почему, ссылаясь на авторитетную документацию в 1-м подвыражении, которое дает вам результат, которого вы не ожидаете, то вы просто просите нас (пере) написать руководство / введение без подробностей о том, что вы уже неправильно понимаете, делаете или не понимаете - несфокусированный вопрос и дубликат того, как работает левое соединение. минимальный воспроизводимый пример включает в себя минимализм и объяснение, это не просто код и не просто какой-то неправильный код. Кроме того, если четко изложить и выразить, это явно будет часто задаваемым вопросом для начинающих. Ожидается исследование.

philipxy 16.05.2022 20:39

@JonasMetzler Это правда, что нам дали код, который мы можем вырезать, вставить, запустить и сравнить с желаемым, и это хорошо, но это еще не все, что нужно для минимальный воспроизводимый пример или хорошего вопроса. Смотрите мой комментарий выше. (Также данные не минимальны.)

philipxy 16.05.2022 20:45
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
3
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Другие вопросы по теме