我有一个母表Person和3个子表:EMPLOYEE,前景,VISITOR.是一个字段名PER_CATEG,包含每行的人员类别(“EMP”表示员工,“PROSP”表示潜在客户,“VIS”表示访问者)。
我正在使用PostgreSQL,但任何使用SQL的人都可以提供帮助。
DROP TABLE IF EXISTS T_PERSONNE;
CREATE TABLE T_PERSONNE(
PER_ID INT GENERATED BY DEFAULT AS IDENTITY (START WITH 1 INCREMENT BY 1),
PER_NOM VARCHAR(50),
PER_PRENOM VARCHAR(50),
PER_DATE_NAISSANCE date,
PER_LOGIN VARCHAR(50),
PER_MDP VARCHAR(50),
PER_CATEG CHAR(5), -- EMP / PROSP / VIS
CONSTRAINT PK_PERSONNE PRIMARY KEY (PER_ID)
);
DROP TABLE IF EXISTS T_EMPLOYE;
CREATE TABLE T_EMPLOYE(
EMP_ID int,
EMP_FONCTION VARCHAR(50),
EMP_DATE_EMBAUCHE date,
EMP_SALAIRE_EURO float,
EMP_EST_DIRECTEUR boolean,
CONSTRAINT PK_EMPLOYE PRIMARY KEY (EMP_ID),
CONSTRAINT FK_PERSONNE_EMPLOYE FOREIGN KEY (EMP_ID) REFERENCES T_PERSONNE (PER_ID)
);
DROP TABLE IF EXISTS T_PROSPECT;
CREATE TABLE T_PROSPECT(
PROSP_ID int,
PROSP_FONCTION VARCHAR(50),
PROSP_DATE_EMBAUCHE date,
PROSP_SALAIRE_EURO float,
PROSP_NOMBRE_TOTAL_VENTE int,
PROSP_BENEFICE_TOTAL_VENTE_EURO float,
PROSP_EST_DIRECTEUR boolean,
CONSTRAINT PK_PROSP PRIMARY KEY (PROSP_ID),
CONSTRAINT FK_PERSONNE_PROSPECT FOREIGN KEY (PROSP_ID) REFERENCES T_PERSONNE (PER_ID)
);
DROP TABLE IF EXISTS T_VISITEUR;
CREATE TABLE T_VISITEUR(
VIS_ID int,
VIS_PROFESSION varchar(50),
VIS_DATE_INSCRIPTION date,
VIS_NOMBRE_VISITE int,
VIS_DATE_DERNIERE_VISITE date,
VIS_REVENU_EURO float,
CONSTRAINT PK_VISITEUR PRIMARY KEY (VIS_ID),
CONSTRAINT FK_PERSONNE_VISITEUR FOREIGN KEY (VIS_ID) REFERENCES T_PERSONNE (PER_ID)
);
母表只包含子表共有的字段。子表只包含它们三者不共有的字段,除了母表和它们的子表的ID相同。
什么是最好的方法来获得一个人的每个字段和他的类别表只知道他的id在一个单一的查询?
我尝试了一个“选择swtich情况”,但我只能得到一列的子表。
代码如下:
SELECT *,
CASE WHEN PER_CATEG='EMP' THEN (select * from T_EMPLOYE where EMP_ID = 1)
WHEN PER_CATEG='PROSP' THEN (select * from T_PROSPECT where PROSP_ID = 1)
WHEN PER_CATEG='VIS' THEN (select * from T_VISITEUR where VIS_ID = 1)
ELSE FALSE
END
FROM T_PERSONNE
WHERE PER_ID = 1;
下面是错误消息:“子查询只能返回一列”。
1条答案
按热度按时间xmd2e60i1#
LEFT JOIN所有三个表到T_PERSONNE,并使用CASE WHEN来选择要显示的数据列。但是,您肯定必须找到一些公共列列表,这些列满足要包含的所有依赖列。在某些情况下,某些列必须包含NULL,使用结果的(应用程序)代码必须考虑决定使用哪些非公共列以及如何使用。