sql - PostgreSql 3 个表的右连接
问题描述
我有 3 张桌子
注册
no_reg | 姓名 |
---|---|
20210520 | 一个 |
20210521 | 乙 |
20210522 | C |
20210523 | D |
20210524 | 乙 |
集成电路
no_icd | no_reg |
---|---|
A000 | 20210520 |
A001 | 20210521 |
A002 | 20210522 |
A003 | 20210523 |
A004 | 20210524 |
DTD
no_dtd | 描述 | no_icd |
---|---|---|
DTD0 | DTD A | A000 |
DTD1 | DTD B | A000 |
DTD2 | DTD C | A222 |
DTD3 | DTD D | A333 |
DTD4 | DTD E | A444 |
我想加入三个表来获得这个结果:
no_dtd | 描述 | no_icd | no_reg | 姓名 |
---|---|---|---|---|
DTD0 | DTD A | A000 | 20210520 | 一个 |
DTD1 | DTD B | A000 | 20210520 | 一个 |
DTD2 | DTD C | A222 | 无效的 | 无效的 |
DTD3 | DTD D | A333 | 无效的 | 无效的 |
DTD4 | DTD E | A444 | 无效的 | 无效的 |
这是我的查询:
SELECT
dtd.no_dtd,
dtd.description,
icd.no_icd,
registration.no_reg,
registration.name
FROM registration
INNER JOIN icd ON registration.no_reg = icd.no_reg
RIGHT JOIN dtd ON icd.no_icd = dtd.no_icd
ORDER BY registration.name ASC;
但不知何故,没有显示包含 NULL 的行,我希望它们出现。
我的查询结果
no_dtd | 描述 | no_icd | no_reg | 姓名 |
---|---|---|---|---|
DTD0 | DTD A | A000 | 20210520 | 一个 |
DTD1 | DTD B | A000 | 20210520 | 一个 |
解决方案
我使用这些数据创建了一个小小提琴
CREATE TABLE REGISTRATIONS (
no_reg int,
name VARCHAR (50),
PRIMARY KEY(no_reg)
);
CREATE TABLE ICD (
no_icd VARCHAR(4),
no_reg int NOT NULL,
PRIMARY KEY(no_icd)
);
CREATE TABLE DTD (
no_dtd VARCHAR(4),
description VARCHAR ( 50 ),
no_icd VARCHAR(4),
PRIMARY KEY(no_dtd)
);
INSERT INTO REGISTRATIONS (no_reg, name) VALUES
(20210520, 'A'),
(20210521, 'B'),
(20210522, 'C'),
(20210523, 'D'),
(20210524, 'E');
INSERT INTO ICD (no_icd, no_reg) VALUES
('A000', 20210520),
('A001', 20210521),
('A002', 20210522),
('A003', 20210523),
('A004', 20210524);
INSERT INTO DTD (no_dtd, description, no_icd) VALUES
('DTD0', 'DTD A', 'A000'),
('DTD1', 'DTD B', 'A000'),
('DTD2', 'DTD C', 'A222'),
('DTD3', 'DTD D', 'A333'),
('DTD4', 'DTD E', 'A444');
似乎您希望显示 DTD 表中的所有记录,因此这应该是连接操作的“主”表,它应该位于左侧。
SELECT D.*, I.no_reg, R.name
FROM DTD D
LEFT JOIN ICD I ON D.no_icd = I.no_icd
LEFT JOIN REGISTRATIONS R ON I.no_reg = R.no_reg;
得到的结果
no_dtd description no_icd no_reg name
DTD0 DTD A A000 20210520 A
DTD1 DTD B A000 20210520 A
DTD2 DTD C A222 (null) (null)
DTD3 DTD D A333 (null) (null)
DTD4 DTD E A444 (null) (null)
推荐阅读
- java - 如何检查文本文件中是否存在单词
- hook - 如何从 MediaWiki SearchAfterNoDirectMatch 挂钩返回文本?
- javascript - 使用类更改单击时的背景颜色
- python-3.x - python 中的 setup.py 显示“ModuleNotFoundError: No module named”尽管它存在并且存在
- asp.net-core - 如何使用 identityserver4 和 asp.netcore 身份进行用户管理
- python - 使用 Python 或 pandas 使用数据集替换另一个数据集中的值
- java - OVERPASS API 中的缩放级别和经纬度之间有什么关系吗?
- javascript - 在 JS 派生类的构造函数中使用 super() 感到困惑
- java - Java 独占全屏模式不断抛出“无效显示模式”
- c# - 重用具有 DbContext 层次结构的 ASP.NET 控制器和服务