由于LEFT JOIN过滤SQL结果依赖于使用Postgres的附加表

时间:2017-04-03 13:35:28

标签: sql postgresql

我有两个基本实体,录音和工作,我有一个包含recordingid,workid的表recording_work_tmp,它只有一行用于特定的录音ID。然后在l_work_work中可能还有另外一项与这项工作相关的工作,然后可能还有另外一项与下一项工作相关的工作,最后是六层。

我想在recording_work_tmp中为每条记录单行显示每个级别的作品(如果有的话)。现在我可以添加distinct on(recordingid)以确保我们在recording_work_tmp中每行不会有多个记录,这不是问题。

问题是只想在链接类型是281的情况下显示其他级别的工作但是如果我将连接更改为LINK表是内部连接那么它将不会返回任何没有每个表的有效链接。

如果我有LEFT JOIN那么它显示的值不应该。在 9165022 12457013 的SQL结果中, 12803999 应为空,因为它们没有正确的链接类型

如果l_work_work表具有link_type值,那么我只能left join这个值,并在此连接中包含链接类型,并且错误的link_type记录将被过滤掉点。但是因为它只在LINK表中,所以当加入l_work_work表时,我无法阻止错误记录的过滤。

如何编写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)
    ;

返回:

 recording_id | work1_id | entity0 | link_type | entity0  | link_type | entity0  | link_type | entity0 | link_type | entity0 | link_type | entity0 | link_type | entity0
--------------+----------+---------+-----------+----------+-----------+----------+-----------+---------+-----------+---------+-----------+---------+-----------+---------
      5710625 |  7472941 | 9492475 |       281 |  9165022 |           | 12457013 |       281 |         |           |         |           |         |           |
      5710625 |  7472941 | 9492475 |       281 | 12803999 |           |          |           |         |           |         |           |         |           |

0 个答案:

没有答案