由于左连接依赖于使用Postgres的附加表,因此筛选SQL结果

由于左连接依赖于使用Postgres的附加表,因此筛选SQL结果,sql,postgresql,Sql,Postgresql,我有两个基本的实体,记录和工作,我有一个表记录工作tmp,包含记录id,工作id,它只有一行特定的记录id。然后在l_工作中有一个潜在的工作链接到这个工作,然后可能有另一个工作链接到下一个工作,等等,高达六个级别 我想在recording_work_tmp中为每条记录指定一行,显示每一级别的作品(如果有)。现在我可以添加distinct on(recordingid)以确保在recording\u work\u tmp中每行不会有多个记录,这不是问题所在 问题是,如果链接类型为281,则只希望显

我有两个基本的实体,记录和工作,我有一个表记录工作tmp,包含记录id,工作id,它只有一行特定的记录id。然后在l_工作中有一个潜在的工作链接到这个工作,然后可能有另一个工作链接到下一个工作,等等,高达六个级别

我想在recording_work_tmp中为每条记录指定一行,显示每一级别的作品(如果有)。现在我可以添加
distinct on(recordingid)
以确保在recording\u work\u tmp中每行不会有多个记录,这不是问题所在

问题是,如果链接类型为281,则只希望显示其他级别的作品,但如果我将“连接到链接表”更改为“内部连接”,则它将不会返回任何没有每个表的有效链接的行

若我有as LEFT JOIN,那个么它会显示它不应该显示的值。在916502212457013的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我知道我不想筛选出行,而不仅仅是想筛选出列值