由于左连接依赖于使用Postgres的附加表,因此筛选SQL结果
我有两个基本的实体,记录和工作,我有一个表记录工作tmp,包含记录id,工作id,它只有一行特定的记录id。然后在l_工作中有一个潜在的工作链接到这个工作,然后可能有另一个工作链接到下一个工作,等等,高达六个级别 我想在recording_work_tmp中为每条记录指定一行,显示每一级别的作品(如果有)。现在我可以添加由于左连接依赖于使用Postgres的附加表,因此筛选SQL结果,sql,postgresql,Sql,Postgresql,我有两个基本的实体,记录和工作,我有一个表记录工作tmp,包含记录id,工作id,它只有一行特定的记录id。然后在l_工作中有一个潜在的工作链接到这个工作,然后可能有另一个工作链接到下一个工作,等等,高达六个级别 我想在recording_work_tmp中为每条记录指定一行,显示每一级别的作品(如果有)。现在我可以添加distinct on(recordingid)以确保在recording\u work\u tmp中每行不会有多个记录,这不是问题所在 问题是,如果链接类型为281,则只希望显
distinct on(recordingid)
以确保在recording\u work\u tmp中每行不会有多个记录,这不是问题所在
问题是,如果链接类型为281,则只希望显示其他级别的作品,但如果我将“连接到链接表”更改为“内部连接”,则它将不会返回任何没有每个表的有效链接的行
若我有as LEFT JOIN,那个么它会显示它不应该显示的值。在9165022,12457013的SQL结果中,12803999应该为空,因为它们没有正确的链接类型
如果l_-work\u-work
表具有link_-type
值,则我可以在该值上进行left join
,并将链接类型包括在此join中,此时将过滤掉具有错误链接类型的记录。但因为它只在链接表中,我无法防止在加入l_工作表时过滤错误记录
如何编写SQL以返回所需的内容
SELECT
t1.recording_id,
t1.work1_id,
t4.entity0,
t5.link_type,
t6.entity0,
t7.link_type,
t8.entity0,
t9.link_type,
t10.entity0,
t11.link_type,
t12.entity0,
t13.link_type,
t14.entity0,
t15.link_type,
t16.entity0
FROM recording_work_tmp t1
LEFT JOIN l_work_work t4
ON t1.work1_id=t4.entity1
LEFT JOIN link t5
ON t4.link=t5.id
and t5.link_type=281
LEFT JOIN l_work_work t6
ON t4.entity0=t6.entity1
LEFT JOIN link t7
ON t6.link=t7.id
AND t7.link_type=281
LEFT JOIN l_work_work t8
ON t6.entity0=t8.entity1
LEFT JOIN link t9
ON t8.link=t9.id
AND t9.link_type=281
LEFT JOIN l_work_work t10
ON t8.entity0=t10.entity1
LEFT JOIN link t11
ON t10.link=t11.id
AND t11.link_type=281
LEFT JOIN l_work_work t12
ON t10.entity0=t12.entity1
LEFT JOIN link t13
ON t12.link=t13.id
AND t13.link_type=281
LEFT JOIN l_work_work t14
ON t12.entity0=t14.entity1
LEFT JOIN link t15
ON t14.link=t15.id
AND t15.link_type=281
LEFT JOIN l_work_work t16
ON t15.link_type=281
LEFT JOIN link t17
ON t16.link=t17.id
AND t17.link_type=281
WHERE (t5.link_type=281 OR t5.link_type is null)
AND (t7.link_type=281 OR t7.link_type is null)
AND (t9.link_type=281 OR t9.link_type is null)
AND (t11.link_type=281 OR t11.link_type is null)
AND (t13.link_type=281 OR t13.link_type is null)
AND (t15.link_type=281 OR t15.link_type is null)
AND (t17.link_type=281 OR t17.link_type is null)
;
返回:
记录| id | work1 | id | entity0 | link | type | entity0 | link | type | entity0 | link | type | entity0 | link | type | entity0 | link | entity0 |
--------------+----------+---------+-----------+----------+-----------+----------+-----------+---------+-----------+---------+-----------+---------+-----------+---------
5710625 | 7472941 | 9492475 | 281 | 9165022 | | 12457013 | 281 | | | | | | |
5710625 | 7472941 | 9492475 | 281 | 12803999 | | | | | | | | | |
当您在WHERE
子句中的左联接中包含右侧表时,它会过滤掉NULL
条件,从而有效地使其成为内部联接。(其中
在外部联接之后执行)。要解决此问题,您需要在相应的ON
子句中包含所有WHERE
条件。@Siyual我知道我不想筛选出行,而不仅仅是想筛选出列值