混淆了如何用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
答案 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
也是笛卡尔积。