sql - 使用多对多关系显示表 1 中的所有记录 - postgresql

标签 sql postgresql postgresql-9.1

我正在尝试创建一个联系人报告,显示所有联系人并选择在场的联系人。

存在被存储在多对多表中。文档 ID 和出席者。

表格如下:

CREATE TABLE pe
    (peid int4, peco int4, pename varchar(30));
INSERT INTO pe
    (peid, peco, pename)
VALUES
    (1, 1,'Carl'),
    (2, 1,'John'),
    (3, 1,'Eric'),
    (4, 2,'Donald')
;

CREATE TABLE co
    (coid int, coname varchar(30));
INSERT INTO co
    (coid, coname)
VALUES
    (1,'Volvo'),
    (2,'BMW'),
    (3,'Microsoft'),
    (4,'Apple')
;

There is a also a doc table that is not needed for this query

CREATE TABLE pres 
    (presid int4, presdoc int4, prespe int4);
INSERT INTO pres
    (presid, presdoc, prespe)
VALUES
    (1,1,1),
    (2,2,2),
    (3,2,3),
    (4,3,1)
;   

无效的查询(无论连接类型如何):

SELECT     pename,coname,presdoc AS present 
FROM       pe 
LEFT JOIN  co ON coid=peco
LEFT JOIN  pres ON prespe=peid
WHERE      peco = 1 AND presdoc=2

这个查询的输出是

John    Volvo  present
Eric    Volvo  present

期望的输出是

Carl    Volvo
John    Volvo  present
Eric    Volvo  present

SQLFiddle:

http://sqlfiddle.com/#!15/77b09/21

提前感谢您提供任何线索。

最佳答案

你能像这样执行吗(如果你只需要检查是否存在)

SELECT     pename,coname,presdoc = 2 AS present 
FROM       pe 
LEFT JOIN  co ON coid=peco
LEFT JOIN  pres ON prespe=peid
WHERE      peco = 1

甚至更好

SELECT DISTINCT     pename,coname,presdoc = 2 AS present 
FROM       pe 
LEFT JOIN  co ON coid=peco
LEFT JOIN  pres ON prespe=peid
WHERE      peco = 1 

关于sql - 使用多对多关系显示表 1 中的所有记录 - postgresql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35936971/

相关文章:

postgresql - WAL 文件来自不同的数据库系统

Java hibernate加入继承(未找到)

.net - 使用 xslt 客户端拆分字符串

database - Postgres 不占用系统资源

java - 使用 jpa 条件创建动态查询

java - 在 hibernate 返回 token 未知时使用内部连接

postgresql - 如何在 Postgresql 中查找特定日期之前的第一个和最后一个日期?

postgresql - 为什么 PostgreSQL 在函数中以不同方式对待我的查询?

mysql - 获取三级子查询中的父列

mysql - SQL - 如何用其他人替换具有 100 列的整个表中的字符?