sql - 如何同时加入和联合
问题描述
我确信这有一个简单的解决方案,但我很难找到它。
我有两张桌子
CREATE TABLE t1 (
"name" VARCHAR(1),
"id" INTEGER,
"data1" VARCHAR(2)
);
INSERT INTO t1
("name", "id", "data1")
VALUES
('a', '1', 'a1'),
('d', '1', 'd1');
CREATE TABLE t2 (
"name" VARCHAR(1),
"id" INTEGER,
"data2" VARCHAR(2)
);
INSERT INTO t2
("name", "id", "data2")
VALUES
('d', '1', 'd2'),
('k', '1', 'k2');
我想要这个最终的组合表:
| name | id | data1 | data2 |
| ---- | --- | ----- | ----- |
| a | 1 | a1 | |
| d | 1 | d1 | d2 |
| k | 1 | | k2 |
我尝试过的事情:
做一个工会
select
t1.name,
t1.id,
t1.data1,
NULL as data2
from t1
union
select
t2.name,
t2.id,
NULL as data1,
t2.data2
from t2
| name | id | data1 | data2 |
| ---- | --- | ----- | ----- |
| a | 1 | a1 | |
| d | 1 | d1 | |
| d | 1 | | d2 |
| k | 1 | | k2 |
做一个完整的加入
select * from t1
full join t2 on t2.id = t1.id
and t2.name = t1.name;
| name | id | data1 | name | id | data2 |
| ---- | --- | ----- | ---- | --- | ----- |
| a | 1 | a1 | | | |
| d | 1 | d1 | d | 1 | d2 |
| | | | k | 1 | k2 |
答案介于两者之间
解决方案
谢谢,戈登和尼克的回答。
我检查了文档,发现了一个更短的变体:
select *
from t1
natural full join t2;
从文档
此外,
JOIN USING
抑制冗余列的输出:不需要打印两个匹配的列,因为它们必须具有相同的值。虽然JOIN ON
从 T1 生成所有列,然后从 T2 生成所有列,JOIN USING
但为每个列出的列对(按列出的顺序)生成一个输出列,然后是 T1 中的任何剩余列,然后是 T2 中的任何剩余列。
推荐阅读
- javascript - 如何使用 javascript 优化整数 toString 方法?
- c - 如何在 C 中设置和更改常量变量/结构/指针的值?
- php - 提交表单时收不到邮件
- javascript - 类如何在反应中调用其他类函数?
- php - 如何使用 curl 发送数组和对象
- javascript - 将自定义数字比例添加到范围滑块
- javascript - 我正在为我的 Discord 机器人创建一个用户信息命令,并想知道是否有办法让 .createdAt 看起来更好
- csv - Dart 出现错误:未定义的名称 'csvCodec'。(undefined_identifier) 使用 csv 包时
- recursion - Elixir:递归生成器
- javascript - 如何在此路径“ID#wpbody-content>div.wrap>a”上编写正确的 getElementBy 并单击使用 applescript 和 javascript