PostgreSQL左连接多个条件

3

我对PostgreSQL仍然是一个新手-有人能帮忙解决这个查询吗:

select distinct j.id, tt.title, m_scopus.provider_id
from journal j   
join temporal_title "tt"   
     on (j.id = tt.journal_id and tt.list_index = 0) 
left join journal_metrics "jm_scopus"  
     on (jm_scopus.journal_id = j.id) 
left join metrics "m_scopus" 
     on (m_scopus.id = jm_scopus.metrics_id 
     and m_scopus.source_id = 235451508 
     and m_scopus.year_integer = 2017)

问题在于我得到了一些“provider_id”为空的行,而我并不想要它们:
journal_id     title                    provider_id
263290036      German Journal of...     scopusJournalsMetricsProvider
263290036      German Journal of...     NULL
72418282       Europa azul              NULL    
207412571      IAC International...     NULL

第1、3和4行是正确的,但第2行不正确,因为我需要的信息是provider_id,如果有就显示该值,如果没有则显示NULL。


第三行和第四行的信息也很有用,因为我需要知道是否有提供者。 - pmelch
你期望的输出是什么? - Tim Biegeleisen
我期望第1行、第3行和第4行。 - pmelch
如果只查询前两个表 from journal j join temporal_title "tt" on (j.id = tt.journal_id and t...,会得到行1、3、4吗? - wildplasser
是的,这将导致行1、3、4。当我添加左连接和多个条件时,我得到了“重复”/行2。如果我省略这两个条件,我也会得到行1、3、4。但我需要这些条件。 - pmelch
1个回答

9
如果我正确理解您的数据(模型),journal_metrics表是一个连接表,在最终结果中不需要,因此可以将其排除在主查询之外,避免双重LEFT JOIN
SELECT j.id, tt.title, m.provider_id
FROM journal j
JOIN temporal_title tt  
    ON j.id = tt.journal_id AND tt.list_index = 0
LEFT JOIN metrics m 
        ON m.source_id = 235451508
        AND m_scopus.year_integer = 2017
        AND EXISTS ( SELECT *
                FROM journal_metrics jm -- The junction table
                WHERE jm.journal_id = j.id 
                AND jm.metrics_id = m.id 
                )
        ;

谢谢 - 查询变得更慢了,但它完成了工作! :-) - pmelch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接