【问题标题】:SQL join two tables with null values in either tableSQL连接两个表中的空值
【发布时间】:2015-07-13 13:05:44
【问题描述】:

我在连接两个表的内容时遇到了一些问题。这是目前的情况:

已购买
文章   已购买 年份     
1            12400    2011     
1              28000    2012    
1             46351    2015     

已售出
文章   已售出      年份     
1            6400      2011     
1              12000    2013    
1             60900    2014     

想要的结果
文章   购买 已售出    年份     
1             12400    6400     kbd>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    

这仅返回 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'    

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

【问题讨论】:

  • 你第一次查询的WHERE中有v.artk,但是没有v表...
  • 您是否想出通过<kbd> 格式化您的查询结果,或者这已经在这里完成了?
  • @PeterLang 在此线程中发现它是第三个答案:meta.stackexchange.com/questions/73566/…
  • @MrBunni:很有趣,谢谢!不过对齐列看起来很麻烦...

标签: sql postgresql


【解决方案1】:

你应该使用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  

【讨论】:

    【解决方案2】:

    听起来你想要一个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 
    

    【讨论】:

      【解决方案3】:

      你可以做一个联合。先用左连接选择,然后将购买中没有对应行的已售结果合并。

      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 article = 1
      Union 
      SELECT article,null, sold, year
      FROM sold where article =1 and year not in (select year from bought)
      

      类似的东西。我还没有测试过,但你可以理解。

      【讨论】:

        猜你喜欢
        • 2021-05-08
        • 2012-08-14
        • 2017-08-30
        • 2015-06-19
        • 1970-01-01
        • 1970-01-01
        • 2022-12-04
        • 1970-01-01
        • 2012-02-28
        相关资源
        最近更新 更多