0

如果我有以下情况:

**table 1
person| money
    A | 2
    B | 10
-------------


**table 2 
person| cars
    A | 3
    C | 10

---------------

两者有什么区别?

SELECT * FROM table1 NATURAL LEFT OUTER JOIN table2;

产生:

person| money |cars
    A | 2     |3
    B | 10    |NULL
---------------

对比

SELECT * FROM table1 LEFT OUTER JOIN table 2 ON person

4

1 回答 1

1

我认为您的非NATURAL版本中有拼写错误,您要比较的是:

SELECT * FROM table1 NATURAL LEFT OUTER JOIN table2;

SELECT * FROM table1 LEFT OUTER JOIN table2 USING ( person );

首先,我希望两者的结果是相等的。**

其次,在您的情况下,我在非NATURAL/USING版本中看不到任何意义,因为您只有一列共有,并且它们的名称一致。

** 我打算用“关系而言”来限定(例如,列顺序和行顺序不相关),但OUTER JOIN明确设计为生成空值,这在关系模型中没有位置!因此,我建议您完全避免并采取另一种方法,例如使用(cars) 作为没有条目的人的默认值OUTER JOIN似乎是完全合理的:0table2

SELECT person, money, cars 
  FROM table1 
       NATURAL JOIN table2
UNION
SELECT person, money, 0 AS cars 
  FROM table1 
 WHERE person NOT IN ( SELECT person FROM table2 );
于 2016-11-03T11:46:49.723 回答