完全外联或联盟?

时间:2010-07-28 09:46:32

标签: sql db2

混淆了如何用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 

5 个答案:

答案 0 :(得分:10)

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

SELECT 
  *
FROM
  table1, table2

SELECT
  * 
FROM 
  table1 CROSS JOIN table2

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

答案 1 :(得分:3)

如果db2有<{p>},请使用cross join

答案 2 :(得分:2)

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

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

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

OR

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

答案 3 :(得分:1)

正如其他答案所说,如果你想要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

答案 4 :(得分:1)

使用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也是笛卡尔积。