合并两个SQL表

时间:2012-07-13 22:31:58

标签: sql join hive

通过在Col1和Col11上进行比较,加入两个表并得到Table1中缺少的第一个表数据和第二个表数据。因为所有ID(Col1和Col11)应该结合在一起

表1

Col1      Col2            Col3                  Col4      Col5            Col6 
1345653   330760137950    2012-07-09 21:40:29   1345653   331760137950    1341895229
1345653   110909316904    2012-07-09 21:29:06   1345653   111909316904    1341894546
1345653   221065796761    2012-07-09 19:31:48   1345653   221065796761    1341887518

表2

Col11        Col22         Col33                  
1345653      330760137950   2012-07-09 21:40:29     
1345653      110909316904   2012-07-09 21:29:06     
1345653      221065796761   2012-07-09 19:31:48     
1345653    **150851771618**   2012-07-09 18:57:33 

如果您查看两个表数据,Table2中的最后一行表示Col22-150851771618中缺少Table1。所以我需要显示Table1完整数据和Table2的最后一行,因为Table1加入了Col1Col11,因为1345653 330760137950 2012-07-09 21:40:29 1345653 331760137950 1341895229 1345653 110909316904 2012-07-09 21:29:06 1345653 111909316904 1341894546 1345653 221065796761 2012-07-09 19:31:48 1345653 221065796761 1341887518 1345653 **150851771618** 2012-07-09 18:57:33 NULL NULL NULL 中缺少Col22,如下所示

JOIN

如何通过加入Col1Col11,使用Col1 Col2 Col3 Col4 Col5 Col6 1345653 330760137950 2012-07-09 21:40:29 1345653 331760137950 1341895229 1345653 110909316904 2012-07-09 21:29:06 1345653 111909316904 1341894546 1345653 221065796761 2012-07-09 19:31:48 1345653 221065796761 1341887518 704318001 320941581940 2012-07-09 14:44:48 704318001 321941581940 1341870288 来完成此操作?我对此很困惑。任何人都可以帮助我吗?

更新: - 更多方案

表1

Col11        Col22         Col33                   Col44   Col55   Col66
1345653      330760137950   2012-07-09 21:40:29     NULL    NULL    NULL
1345653      110909316904   2012-07-09 21:29:06     NULL    NULL    NULL
1345653      221065796761   2012-07-09 19:31:48     NULL    NULL    NULL
1345653    **150851771618**   2012-07-09 18:57:33   NULL    NULL    NULL

704318001  **290738585064**    2012-07-09 14:36:49     NULL    NULL    NULL

表2

1345653

所以输出应该是这样的 - 这个704318001 ID的含义,我需要在同一个地方和1345653相同的所有记录。因此,如果您查看输出,则所有704318001都在一起且所有1345653 330760137950 2012-07-09 21:40:29 1345653 331760137950 1341895229 1345653 110909316904 2012-07-09 21:29:06 1345653 111909316904 1341894546 1345653 221065796761 2012-07-09 19:31:48 1345653 221065796761 1341887518 1345653 **150851771618** 2012-07-09 18:57:33 NULL NULL NULL 704318001 320941581940 2012-07-09 14:44:48 704318001 321941581940 1341870288 704318001 **290738585064** 2012-07-09 14:36:49 NULL NULL NULL 都在一起。

{{1}}

基本上,获取表1中的第一个表和第二个表,其数据不在表1中

4 个答案:

答案 0 :(得分:4)

LEFT JOIN应该有效..

但根据您的数据,我认为您应该加入Col22Col2,因为Col1Col11没有唯一值,所以我不喜欢不知道他们是如何联系在一起的。

SELECT t2.Col11, t2.Col22, t2.Col33, t1.Col4, t1.Col5, t1.Col6
FROM 
    Table2 t2 LEFT JOIN
    Table1 t1 ON t1.Col2 = t2.Col22

答案 1 :(得分:1)

我认为你需要在table2中添加行,在table1中的前三列中找不到匹配项。您可以将union allexists结合使用。如果数据库支持except,您可以使用它而不是存在。

select Col1, Col2, Col3, Col4, Col5, Col6
  from table1
union all
select Col11, Col22, Col33, null, null, null
  from table2
 where not exists (select null
                     from table1
                    where table1.col1 = table2.col11
                      and table1.col2 = table2.col22
                      and table1.col3 = table2.col33)

UPDATE after clarification: if you can use union all and left join this SQL FIDDLE should help:

select buyer_id, item_id, created_time, user_id, product_id, timestamps
  from TestingTable1
union all
select t2.buyer_id, t2.item_id, t2.created_time, null, null, null
  from TestingTable2 t2
  left join TestingTable1 t1
    on t1.buyer_id = t2.buyer_id
   and t1.item_id = t2.item_id
   -- remove this line if you identify duplicated record
   -- by buyer and item only
   and t1.created_time = t2.created_time
 where t1.buyer_id is null

答案 2 :(得分:0)

我不确定,预期输出究竟是什么 - 例如,您是否只需要部分外连接或完全外连接?假设您需要完全外连接,这可能会起作用(T-SQL语法):

select
    coalesce(t1.col1, t1.col11),
    coalesce(t1.col2, t1.col22),
    coalesce(t1.col3, t1.col33),
    coalesce(t1.col4, t1.col44),
    coalesce(t1.col5, t1.col55),
    coalesce(t1.col6, t1.col66),
from
    Table1 t1
    full outer join Table2 t2 on t2.Col22 = t1.Col2
希望这就是你所需要的。它应该连接Col2-Col22列上两个表的所有行,并显示Table1中的每个列对值,如果有一个空值,它应该显示Table2中的值

编辑:您无法加入Col1-Col11上的表格。事实上,在这个例子中,这将产生笛卡尔积。但可能 - 取决于数据的真实含义 - 可能是有用的连接Col1 = Col11和Col2 = Col22

答案 3 :(得分:0)

为什么不简单 -

SELECT * FROM Table2;

否则请将问题更清楚。