下面有两个表。我正在寻找sales2
中不存在于sales1
中的store
和newid
的所有组合,并将它们与sales1
组合。
我正在寻找最终结果是:
store newid amount total
123 | 123 | 12.3 | 1
456 | 123 | 45.6 | 2
789 | adsf | 78.9 | 3
321 | 123f | NULL | NULL
789 | 1654 | NULL | NULL
原始表格
CREATE TABLE sales1 (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
store VARCHAR(30) NOT NULL,
newid VARCHAR(30),
amount DOUBLE,
total INT
);
CREATE TABLE sales2 (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
store VARCHAR(30) NOT NULL,
newid VARCHAR(30),
amount DOUBLE
);
INSERT INTO sales1 (store, newid, amount, total) VALUES
('123','123', 12.3, 1),('456','123', 45.6, 2),('789','adsf', 78.9, 3);
INSERT INTO sales2 (store, newid, amount) VALUES
('123','123', Null),('456','123', Null),('321','123f', Null),('789','1654', Null);
- 我们可以为此使用两个不同的
SELECT
查询。第一个查询将从sales1
表中获取所有行 - 第二种方法是从
sales2
表中提取剩余的行,这些行在sales1
表中不存在。我们将使用从sales2
到sales1
的LEFT JOIN
,并且只考虑在Join之后sales1.id
是NULL
的那些行 - 我们最终将使用
UNION ALL
来组合来自两个查询的结果集
查询
SELECT
s1.store, s1.newid, s1.amount, s1.total
FROM sales1 s1
UNION ALL
SELECT
s2.store, s2.newid, s2.amount, NULL AS total
FROM sales2 s2
LEFT JOIN sales1 s1
ON s2.store = s1.store AND
s2.newid = s1.newid
WHERE s1.id IS NULL;
结果
| store | newid | amount | total |
| ----- | ----- | ------ | ----- |
| 123 | 123 | 12.3 | 1 |
| 456 | 123 | 45.6 | 2 |
| 789 | adsf | 78.9 | 3 |
| 321 | 123f | | |
| 789 | 1654 | | |
查看DB Fiddle