在结果集中并排加入列

时间:2012-11-17 03:35:05

标签: sql oracle

我希望我的结果看起来像这样

    FirstName1     LastName1         FirstName2      LastName2
       Amy           Smith              Bob            Stone
      Fred           Joker              Gina           White

其中FirstName1和FirstName2具有相同的数据类型,但我无法用于加入(假设没有人具有相同的名称),LastName1和LastName2也是如此。
我试图创建2个表。第一个表包含FirstName1和LastName1。第二个表包含Firstname2和LastName2。
然后我用

SELECT table1.FirstName1, table1.LastName1, table2.FirstName2, table2.LastName2
FROM table1, table2;

但这给了我很多重复。有什么建议?

3 个答案:

答案 0 :(得分:3)

SELECT t1.FirstName1, t1.LastName1, t2.FirstName2, t2.LastName2
FROM
    (SELECT 
         FirstName1, 
         LastName1, 
         ROW_NUMBER() OVER (ORDER BY FirstName1) 'RowNumber'
     FROM table1
    ) AS t1
    FULL OUTER JOIN
    (SELECT 
         FirstName2, 
         LastName2, 
         ROW_NUMBER() OVER (ORDER BY FirstName2) 'RowNumber'
     FROM table2
    ) AS t2
    ON t1.RowNumber = t2.RowNumber

FULL OUTER JOIN将处理两个表中的行数不相同的情况。

答案 1 :(得分:0)

你永远不应该做你想做的事情,但要尝试使用DISTINCT

SELECT Distinct 
    table1.FirstName1, 
    table1.LastName1, 
    table2.FirstName2, 
    table2.LastName2
FROM table1, table2;  

您的方法存在的问题是检索到的数据集没有任何意义。你为什么要这样做呢?

编辑:您可以随时执行此操作:

select table1.FirstName1, table1.LastName1, table2.FirstName2, table2.LastName2
from table1, table2   
where table1.rownum= table2.rownum;

答案 2 :(得分:0)

  

“哦哈哈,我真的只是想让它看起来很漂亮。我已经习惯了   用C和Java编程,各种输出都很漂亮   可能。 “

数据库编程是不同的。在这个领域中,内容比仅仅漂亮更重要。因此,当涉及到结果集时,数据库会坚持一行中的所有列共享一个有意义的关系(线索在名称,关系数据库中)。

您的问题是,您没有没有共同密钥的表,因此无法将两组行连接在一起。如果没有合适的WHERE子句,数据库就会实现交叉连接,即笛卡尔积,这就是所有复制的来源。

鉴于你没有有意义的钥匙,你唯一的选择是假装它们; the approach shown by Vikdor是实现这一目标的一种方式。