为什么我在 SQL 中的 LEFT JOIN 中的匹配变量上得到空值?
Why am I getting null values on the matched variables in a LEFT JOIN in SQL?
我正在尝试左加入一个包含所有可能日期的 table 和一个 table,该 table 包含给定日期的 id 信息,但日期之间存在间隔。下面的代码将生成示例 tables.
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 |
几乎是打字错误,但您应该从 date_info
table:
中选择 info_id
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;
在您当前的查询中,对于 date_info
中与右侧 table 中的任何记录不匹配的那些记录,选择 ei.info
将始终是 null
加入。
我正在尝试左加入一个包含所有可能日期的 table 和一个 table,该 table 包含给定日期的 id 信息,但日期之间存在间隔。下面的代码将生成示例 tables.
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 |
几乎是打字错误,但您应该从 date_info
table:
info_id
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;
在您当前的查询中,对于 date_info
中与右侧 table 中的任何记录不匹配的那些记录,选择 ei.info
将始终是 null
加入。