我有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语句来解决该问题,但它将结果表中的记录相乘。
谢谢你的帮助!
答案 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