SQL在两个表中连接两个具有空值的表

MrB*_*nni 8 sql postgresql

我在加入两个表的内容时遇到了一些麻烦.这是目前的情况:


Article   Bought Year     
1             12400    2011     
1             28000    2012     
1             46351    2015     

出售
Article   Sold      Year     
1             6400      2011     
1             12000    2013     
1             60900    2014     

期望的结果
Article   Bought Sold    Year     
1             12400    6400    2011     
1             28000    NULL   2012     
1             NULL     12000  2013     
1             NULL     60900  2014     
1             46351    NULL   2015     

我尝试了以下方法来达到预期的效果:

SELECT b.article, b.bought, s.sold, b.year
FROM Bought AS b
  LEFT JOIN Sold as s ON s.article = b.article AND s.year = b.year
WHERE b.article = '1'
ORDER BY b.year    
Run Code Online (Sandbox Code Playgroud)

这仅返回2011年的结果(两个值都存在).

使用包含所有文章的第三个表的另一个尝试返回了相同的错误结果,并且它有两年的列,这是不理想的:

SELECT art.article, b.bought, s.sold, b.year, s.year
FROM articles AS art
  LEFT OUTER JOIN bought AS b ON art.article = b.article
  LEFT OUTER JOIN Sold AS s ON art.article = s.article
     AND (b.year = s.year OR b.year IS NULL OR s.year IS NULL)
 WHERE art.article = '1'    
Run Code Online (Sandbox Code Playgroud)

我尝试过使用最后一个SQL语句的不同类型的连接,但它们似乎都不起作用.我怎样才能达到预期的效果?

Gor*_*off 12

听起来你想要一个full outer join:

SELECT coalesce(b.article, s.article) as article, b.bought, s.sold,
       coalesce(b.year, s.year) as year
FROM Bought b FULL OUTER JOIN
     Sold s
     ON s.article = b.article AND s.year = b.year
WHERE (b.article = '1' OR s.article = '1')
ORDER BY year 
Run Code Online (Sandbox Code Playgroud)


pot*_*hin 5

你应该使用full outer join

select coalesce(b.article, s.article)
     , b.bought
     , s.sold
     , coalesce (b.year, s.year) as year
from Bought b
full join Sold s on s.article = b.article
                 and s.year = b.year
where coalesce(b.article, s.article) = '1'
order by year  
Run Code Online (Sandbox Code Playgroud)