SQL服务器 - 在连接中正确填充

时间:2015-10-19 09:14:00

标签: sql sql-server tsql join sql-server-2012

我有两张桌子:

table 1:
rN        rnk           rid      rsn       rsi    tid  rd            r
abc_1m   xy_mfgabc1m_z   1      penta      1      27   2009-01-01    1.2
abc_1m   xy_mfgabc1m_z   1      penta      1      27   2009-01-02    0.3  
abc_3m   xy_mfgabc3m_z   2      penta      1      30   2009-01-01    0.6 
abc_3m   xy_mfgabc3m_z   2      penta      1      30   2009-01-02    0.4
  • rN是100多个值的列表
  • rnk也是一个包含100多个值的列表
  • 摆脱(这个和tid有一个代码取决于rN)
  • rsn总是一样的
  • rsi总是一样的
  • tid是100多个值的列表(这个和rid有一个代码取决于 rN)
  • 日期从2009年到asofdate
  • r是一些数值

表1有超过100.000行 表2较小,@ 2000行。

table 2:     

     rN        rnk           rid      rsn       rsi    tid  rd            r
    tdf_1y   xy_mfgtdf1y_z   90      penta      1      94   2009-01-01    1.7
    tdf_1y   xy_mfgtdf1y_z   90      penta      1      94   2009-01-02    0.7  
    tdf_1y   xy_mfgtdf1y_z   90      penta      1      94   2009-01-01    0.2 
    tdf_1y   xy_mfgtdf1y_z   90      penta      1      94   2009-01-02    0.9

我希望从表1中获取所有内容,并将表2附加到表1中。 预期表:

table 3 :
rN        rnk           rid      rsn       rsi    tid  rd            r
abc_1m   xy_mfgabc1m_z   1      penta      1      27   2009-01-01    1.2
abc_1m   xy_mfgabc1m_z   1      penta      1      27   2009-01-02    0.3  
abc_3m   xy_mfgabc3m_z   2      penta      1      30   2009-01-01    0.6 
abc_3m   xy_mfgabc3m_z   2      penta      1      30   2009-01-02    0.4
tdf_1y   xy_mfgtdf1y_z   90     penta      1      94   2009-01-01    1.7
tdf_1y   xy_mfgtdf1y_z   90     penta      1      94   2009-01-02    0.7  
tdf_1y   xy_mfgtdf1y_z   90     penta      1      94   2009-01-01    0.2 
tdf_1y   xy_mfgtdf1y_z   90     penta     1      94   2009-01-02    0.9

如果我想要第一张表中的所有内容以及第二张表中的所有内容,那么这应该是完全外部联接,对吗?

我的问题是我不知道如何分组,因为如果我这样做,我会从table1获得所有内容,而不是来自table2

select one.* from table1
join table2 two on one.rsn = two.rsn
group by one.rN, one.rnk, one.rid, one.rsn, one.rsi, one.tid, one.rd, one.r
order by rid

如果我不对它们进行分组,那么我将拥有数百万条记录,因此我必须以某种方式对其进行分组。 我认为我没有正确地使用灌浆,也许是我加入它们的列。

任何建议都会很受欢迎,因为这看起来很简单但却看不到解决方案。 感谢

编辑:

谢谢大家的回答。你们都给了我一些我忘记的重要信息。我完全错过了我可以使用工会的事实。话虽如此,我选择了第一个发布的答案(因为或多或少你们都说了同样的话 - 我赞成你们所有人,因为每个答案都让我知道我应该怎么做,再次感谢你们)

3 个答案:

答案 0 :(得分:2)

  

如果我想要第一张表中的所有内容和第二张表中的所有内容,那么这应该是一个完整的外连接,对吗?

根据您对问题的描述以及您的示例"表3",否。您根本不想要JOIN,因为两个表中的行之间没有任何关系。你想要的是一个UNION,因为你想要一个新的结果集,它只是table1中的所有行加上table2中的所有行。

所以(假设他们的列的顺序相同):

SELECT * FROM table1
UNION
SELECT * FROM table2

由于UNION的性质,它基本上会完成您的GROUP BY似乎要做的事情:删除任何重复的行。

答案 1 :(得分:2)

请使用UNION / UNION ALL运算符。因为您的表具有完全相同的列名和相同的列顺序,所以您只需执行

select * from 

对他们两个。

如果要删除重复和排序结果,请使用UNION。 如果你没有重复(或者你不在乎),那就使用UNION ALL,因为它更快。

select * from table1 
union all 
select * from table2

答案 2 :(得分:1)

只需使用UNION运算符:

SELECT t1.* FROM table1 t1
UNION ALL
SELECT t2.* FROM table2 t2

JOIN不是一种可行的方式,因为这会使结果集中包含与table1table2对应的新列。根据经验,当您想要将2个表堆叠在一起时,可以使用UNION,当您想引入新列或优化现有列时,可以使用JOIN