0

If I have the following situations:

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


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

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

What is the difference between the two?

SELECT * FROM table1 NATURAL LEFT OUTER JOIN table2;

produces:

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

vs

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 );

まず、両方の結果が等しいことを期待します。**

第二に、共通の列が1つしかなく、一貫して名前が付けられているため、あなたの場合、非NATURAL/バージョンには何の意味もありません。USING

** 「関係的に言えば」(たとえば、列の順序と行の順序は関係ありません) で修飾するつもりでしたがOUTER JOIN、リレーショナル モデルには存在しない null を生成するように明示的に設計されています! したがって、完全に回避して別のアプローチを取ることをお勧めします。たとえば、 にエントリがない人のデフォルト値として (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 に答える