繁体   English   中英

完全外联或联盟?

[英]FULL OUTER JOIN or UNION?

困惑如何实现这一点可能与FULL OUTER或UNION。 我想以这样的方式加入结果

Table1                     Table2
---------------           ----------------- 
ID  Name Salary           ID    Fruits
---------------           ----------------- 
1   John   1000           1     Apples 
1   Henry  4000           1     Mangoes 
1   Smith  1000           1     Tomatoes

结果应该是

ResultTable
       ------------------------
       ID Name  Salary  Fruits
       -----------------------   
       1  John  1000    Apples
       1  John  1000    Mangoes
       1  John  1000    Tomatoes
       1  Henry 4000    Apples
       1  Henry 4000    Mangoes
       1  Henry 4000    Tomatoes
       1  Smith 1000    Apples
       1  Smith 1000    Mangoes
       1  Smith 1000    Tomatoes 

您需要笛卡尔产品加入或交叉加入..

SELECT 
  *
FROM
  table1, table2

要么

SELECT
  * 
FROM 
  table1 CROSS JOIN table2

(参考: http//publib.boulder.ibm.com/iseries/v5r2/ic2924/index.htm?info / sqlp / rbafymstcrojo.htm

如果db2有它,请使用cross join

您可能想要重新考虑您的数据库命名标准 - 将列命名为“ID”,但允许重复不是一个好主意恕我直言。

由于重复,不太清楚需要什么,但假设ID是红鲱鱼,我认为CROSS JOIN是你方案中的正确方法

select t1.ID, t1.Name, t1.Salary, t2.Fruit 
from Table1 t1, Table2 t2 

要么

select t1.ID, t1.Name, t1.Salary, t2.Fruit 
from Table1 t1 CROSS JOIN Table2 t2 

正如其他答案所说,如果你想要Table2中的所有行表2中的所有行,那么交叉连接(即笛卡尔连接)就是答案。

另一方面,在上面的场景中,ID上的内部联接也将返回相同的结果集:

select t1.ID, t1.Name, t1.Salary, t2.Fruit 
from Table1 t1 join Table2 t2 on t1.id = t2.id

然后,如果此查询与某些Crystal问题存在相同的问题,您可能会发现此结果集更有用:

ResultTable

   ------------------------
   ID Name  Salary  Fruits
   -----------------------   
   1  John  1000    
   1  Henry 4000    
   1  Smith 1000    
   1                Apples
   1                Mangoes
   1                Tomatoes 

可以使用此查询获得:

select ID, Name, Salary, '' Fruit from Table1 union all
select ID, '' Name, NULL Salary, Fruit from Table2

使用CROSS JOIN

SELECT T1.Name, T1.Salary, T2.Fruit 
  FROM Table1 AS T1
       CROSS JOIN Table2 AS T2;

避免使用固定符号:

SELECT T1.Name, T1.Salary, T2.Fruit 
  FROM Table1 AS T1, Table2 AS T2;

我不太清楚为什么但是民间肯定不喜欢加密的符号,特别是当你添加一个WHERE子句时。 他们会告诉你CROSS JOIN是SQL-92,这确实是正确的,但是后面的输入符号也是SQL-92。

哦,有些人把没有WHERE子句的加密符号称为笛卡儿积,这确实是正确的,但是CROSS JOIN也是笛卡尔积。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM