首页 > 解决方案 > 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 一个

标签: sqlpostgresql

解决方案


我使用这些数据创建了一个小小提琴

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)

推荐阅读