1

在国语中,

countrycode | language  
US | English  
BR | Portuguese  
UK | English  

以国名,

countrycode | name  
CN | China  
BR | Brazil  
JP | Japan  

“内部联接通过从联接表中选择匹配行的组合来产生结果。但是,它找不到不匹配的”

“左连接将左表(第一个命名)视为参考表,并为从中选择的每一行生成输出,无论该行是否与右表中的行匹配”

获取我们,uk,cn 和 jp,但不是 br:

  • 内部连接无法找到不匹配项(br <> br 不起作用)。
  • 外连接会在一个中找到所有(us 和 uk)或在另一个中找到所有(cn 和 jp)。

你使用两个外连接吗?

4

2 回答 2

0

您所追求的称为完全外部联接,MySQL 没有明确的语法。采用:

SELECT cl.countrycode,
       cl.language
  FROM COUNTRYLANGUAGE cl
 WHERE NOT EXISTS(SELECT NULL
                    FROM COUNTRYNAME cn
                   WHERE cn.countrycode = cl.countrycode)
UNION ALL
SELECT cn.countrycode,
       cn.name
  FROM COUNTRYNAME cn
 WHERE NOT EXISTS(SELECT NULL
                    FROM COUNTRYLANGUAGE cl
                   WHERE cl.countrycode = cn.countrycode)

这是一个很好的参考链接,带有各种 JOIN 的可视化示例

于 2010-07-13T19:34:29.857 回答
0

解决此问题的另一种方法是:

select countrycode, max(language), max(name) from
(select countrycode, language, ' ' name from countrylanguage union all
select countrycode, ' ' language, name from countryname ) ilv
group by countrycode having count(*) = 1
于 2010-07-14T12:32:42.573 回答