SQL Server - 在联接中正确分组

标签 sql sql-server t-sql 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 多个值的列表
  • 也有rid(这和tid有一个代码,具体取决于rN)
  • rsn 始终相同
  • rsi 始终相同
  • tid 是 100 多个值的列表(this 和 rod 有一个代码,具体取决于 rN)
  • 从 2009 年至今的第一个日期
  • 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

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

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

编辑:

谢谢大家的回答。你们都给了我重要的信息,但我忘记了。我完全错过了我可以使用 union 的事实。话虽这么说,我选择第一个发布的答案作为已接受的答案(因为你们或多或少都说了同样的话 - 我对你们所有人都投了赞成票,因为每个答案都让我了解了我应该如何做这件事,再次感谢你们)

最佳答案

If i want everything from the first table and everything from the second table, this should be a full outer join, right?

根据您对问题的描述以及您的示例“表 3”,没有。您根本不需要 JOIN,因为两个表中的行之间没有关系。您想要的是 UNION,因为您想要一个新的结果集,其中包含 table1 中的所有行加上 table2 中的所有行。

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

SELECT * FROM table1
UNION
SELECT * FROM table2

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

关于SQL Server - 在联接中正确分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33210691/

相关文章:

t-sql - 合并 - 匹配时则不执行任何操作

sql - 存储过程sql中的日期转换

t-sql - 搜索查询动态与静态 - SQL Server 2012

mysql - SQL - 排序依据然后分组依据

sql-server - 如何查找哪些存储过程正在使用哪些索引?

sql-server - SQL Profiler - 哪些方面可以改进?

c# - 具有 linq 数据上下文的存储过程返回值

mysql - 选择任何记录中不为空的列

sql - 如何在 sql 数据库中保存顺序(排列)

mysql - iReport 说 'The document has no pages'