PostgreSQL - 使用语句从许多不同的表中获取一个表

时间:2016-02-24 22:11:53

标签: sql postgresql left-join

我有4张这样的表

table a:

art_id |  name | surname
-------+-------+--------
  1    | John  | McA
  2    | Alex  | McB
  3    | Juddy | McC

table b:
art_id is a foreign key to table a
diff_id is foreign key to table c

art_id | title | diff_id
-------+-------+--------
  1    | smth  | 1.1
  2    | else  | 1.2
  3    | here  | 1.3 

table c:
class is foreign key to table d

class  | date  | diff_id
-------+-------+--------
  a    | 01.02 | 1.1
  b    | 02.03 | 1.2
  c    | 03.04 | 1.3 

 table d:

class  | deputy|
-------+-------+
  a    | John  | 
  b    | Marc  | 
  c    | Sophie| 

我试图编写一个postresql语句来拥有一个像这样的表:

table result:

| title | deputy |
+-------+--------+
| smth  |  John  | 
| else  |  Marc  |
| here  | Sophie |

我正试图通过WITH AS声明bun来实现它,此刻我被卡住了。 在语句中创建递归表之后,我试图通过执行LEFT JOIN语句来解决该问题,但它将结果表中的记录相乘。

谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

我认为您通过递归查询和存储立即值来完成复杂任务。我相信简单的JOIN就足以满足您的目标。

SELECT
    b.title, d.deputy
FROM
    b
    INNER JOIN c ON b.diff_id = c.diff_id
    INNER JOIN d ON c.class = d.class

如果您需要在副列中没有匹配值时显示标题,则可能需要将INNER更改为LEFT类型的加入。

此外,如果您在title列中使用完全相同的值deputy收到多个结果,请考虑添加DISTINCT子句:

SELECT DISTINCT
    b.title, d.deputy
FROM
    b
    INNER JOIN c ON b.diff_id = c.diff_id
    INNER JOIN d ON c.class = d.class

如果你真的觉得需要包含表a,那么重写查询:

SELECT
    b.title, d.deputy
FROM
    a
    INNER JOIN b ON a.art_id = b.art_id
    INNER JOIN c ON b.diff_id = c.diff_id
    INNER JOIN d ON c.class = d.class