2

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

    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;

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

4

3 回答 3

5
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将处理两个表中的行数不相同的情况。

于 2012-11-17T04:11:51.640 回答
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;
于 2012-11-17T03:37:29.973 回答
0

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

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

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

鉴于您没有有意义的密钥,您唯一的选择就是伪造它们;Vikdor 展示的方法是实现这一目标的一种方法。

于 2012-11-17T08:02:42.877 回答