【问题标题】:Merge two tables with DateTime primary key, but different columns合并两个具有 DateTime 主键但列不同的表
【发布时间】:2014-03-12 05:52:11
【问题描述】:

我已经搜索了几个小时,但我的问题没有具体的答案。

我有两张表,例如:

表 A

DateAndTime             ms  us  F1      F2      F3
2012-07-07 00:00:00.000 0   0   1       1       1   
2012-07-07 01:07:40.000 750 361 1       0       1   
2012-07-07 01:07:41.000 50  11  1       0       1  
2012-07-07 01:08:35.000 850 998 1       0       0
2012-07-07 01:08:36.000 50  83  1       0       0
2012-07-07 01:08:59.000 250 26  0       0       0

表 B

DateAndTime             ms  us  F4      F5      F6
2012-07-07 00:00:00.000 0   0   1869    11      2247
2012-07-07 00:00:00.000 0   588 1869    15      2247
2012-07-07 00:05:14.000 987 359 1869    13      2251
2012-07-07 00:05:16.000 45  493 1869    11      2247
2012-07-07 00:14:15.000 985 557 1869    11      2157
2012-07-07 00:14:16.000 945 179 1869    11      2279

我正在寻找的结果是合并这两个表:

结果表

DateAndTime             ms  us  F1      F2      F3      F4      F5      F6
2012-07-07 00:00:00.000 0   0   1       1       1       1869    11      2247
2012-07-07 00:00:00.000 0   588 NULL    NULL    NULL    1869    15      2247 
2012-07-07 00:05:14.000 987 359 NULL    NULL    NULL    1869    13      2251
2012-07-07 00:05:16.000 45  493 NULL    NULL    NULL    1869    11      2247
2012-07-07 00:14:15.000 985 557 NULL    NULL    NULL    1869    11      2157
2012-07-07 00:14:16.000 945 179 NULL    NULL    NULL    1869    11      2279
2012-07-07 01:07:40.000 750 361 1       0       1       NULL    NULL    NULL     
2012-07-07 01:07:41.000 50  11  1       0       1       NULL    NULL    NULL     
2012-07-07 01:08:35.000 850 998 1       0       0       NULL    NULL    NULL  
2012-07-07 01:08:36.000 50  83  1       0       0       NULL    NULL    NULL  
2012-07-07 01:08:59.000 250 26  0       0       0       NULL    NULL    NULL  

两个表中的 PRIMARY KEY 由 (DateAndTime, ms, us) 组成。

如果两个表具有相同的主键,则数据可以合并到同一行,否则应该只是在没有数据的地方出现带有 NULL 的新行。

列名并不总是相同,因此我必须使用 C# 动态构建查询,然后执行它。在开始用 C# 处理数据之前,我只是想在 SQL 服务器端做尽可能多的工作。

【问题讨论】:

  • 尝试使用LEFT JOIN

标签: sql sql-server join


【解决方案1】:

试试下面的查询..

SELECT A.DATEANDTIME,A.MS,A.US,A.F1,A.F2,A.F3,B.F4,B.F5,B.F6 FROM TABLEA A FULL OUTER JOIN TABLEB B ON A.DATEANDTIME = B.DATEANDTIME
UNION
SELECT B.DATEANDTIME,B.MS,B.US,A.F1,A.F2,A.F3,B.F4,B.F5,B.F6 FROM TABLEA A FULL OUTER JOIN TABLEB B ON A.DATEANDTIME = B.DATEANDTIME

【讨论】:

  • 您需要加入主键。不仅在日期时间字段上。它应该是 datetime、ms 和 us 的组合。请在发布之前测试您的结果,或者至少提及它未经测试。选民至少可以在这样做之前验证答案
  • 即使我添加了“ms”和“us”字段,它仍然会做一些奇怪的事情。有些地方 DateAndTime、ms 和 us 都是 NULL,即使它们在我的数据集中的任何地方都不为 NULL。
【解决方案2】:

使用下面的 SQL server 或 MY SQL

SELECT T1.DATEANDTIME,
       T1.MS,
       T1.US,
       T1.F1,
       T1.F2,
       T1.F3,
       T2.F4,
       T2.F5,
       T2.F6
FROM   T1
       LEFT OUTER JOIN
       T2
          ON ( T1.DATEANDTIME = T2.DATEANDTIME AND T1.MS = T2.MS AND T1.US = T2.US )
UNION
SELECT T2.DATEANDTIME,
       T2.MS,
       T2.US,
       T1.F1,
       T1.F2,
       T1.F3,
       T2.F4,
       T2.F5,
       T2.F6
FROM   T1
       RIGHT OUTER JOIN
       T2
          ON ( T1.DATEANDTIME = T2.DATEANDTIME AND T1.MS = T2.MS AND T1.US = T2.US );

这是给甲骨文的

WITH T1
     AS (SELECT '2012-07-07 00:00:00.000' AS DATEANDTIME,
                '0' AS MS,
                '0' AS US,
                '1' AS F1,
                '1' AS F2,
                '1' AS F3
         FROM   DUAL
         UNION ALL
         SELECT '2012-07-07 01:07:40.000' AS DATEANDTIME,
                '750' AS MS,
                '361' AS US,
                '1' AS F1,
                '0' AS F2,
                '1' AS F3
         FROM   DUAL
         UNION ALL
         SELECT '2012-07-07 01:07:41.000' AS DATEANDTIME,
                '50' AS MS,
                '11' AS US,
                '1' AS F1,
                '0' AS F2,
                '1' AS F3
         FROM   DUAL
         UNION ALL
         SELECT '2012-07-07 01:08:35.000' AS DATEANDTIME,
                '850' AS MS,
                '998' AS US,
                '1' AS F1,
                '0' AS F2,
                '0' AS F3
         FROM   DUAL
         UNION ALL
         SELECT '2012-07-07 01:08:36.000' AS DATEANDTIME,
                '50' AS MS,
                '83' AS US,
                '1' AS F1,
                '0' AS F2,
                '0' AS F3
         FROM   DUAL
         UNION ALL
         SELECT '2012-07-07 01:08:59.000' AS DATEANDTIME,
                '250' AS MS,
                '26' AS US,
                '0' AS F1,
                '0' AS F2,
                '0' AS F3
         FROM   DUAL),
     T2
     AS (SELECT '2012-07-07 00:00:00.000' AS DATEANDTIME,
                '0' AS MS,
                '0' AS US,
                '1869' AS F4,
                '11' AS F5,
                '2247' AS F6
         FROM   DUAL
         UNION ALL
         SELECT '2012-07-07 00:00:00.000' AS DATEANDTIME,
                '0' AS MS,
                '588' AS US,
                '1869' AS F4,
                '15' AS F5,
                '2247' AS F6
         FROM   DUAL
         UNION ALL
         SELECT '2012-07-07 00:05:14.000' AS DATEANDTIME,
                '987' AS MS,
                '359' AS US,
                '1869' AS F4,
                '13' AS F5,
                '2251' AS F6
         FROM   DUAL
         UNION ALL
         SELECT '2012-07-07 00:05:16.000' AS DATEANDTIME,
                '45' AS MS,
                '493' AS US,
                '1869' AS F4,
                '11' AS F5,
                '2247' AS F6
         FROM   DUAL
         UNION ALL
         SELECT '2012-07-07 00:14:15.000' AS DATEANDTIME,
                '985' AS MS,
                '557' AS US,
                '1869' AS F4,
                '11' AS F5,
                '2157' AS F6
         FROM   DUAL
         UNION ALL
         SELECT '2012-07-07 00:14:16.000' AS DATEANDTIME,
                '945' AS MS,
                '179' AS US,
                '1869' AS F4,
                '11' AS F5,
                '2279' AS F6
         FROM   DUAL)
SELECT T1.DATEANDTIME,
       T1.MS,
       T1.US,
       T1.F1,
       T1.F2,
       T1.F3,
       T2.F4,
       T2.F5,
       T2.F6
FROM   T1
       LEFT OUTER JOIN
       T2
          ON ( T1.DATEANDTIME = T2.DATEANDTIME AND T1.MS = T2.MS AND T1.US = T2.US )
UNION
SELECT T2.DATEANDTIME,
       T2.MS,
       T2.US,
       T1.F1,
       T1.F2,
       T1.F3,
       T2.F4,
       T2.F5,
       T2.F6
FROM   T1
       RIGHT OUTER JOIN
       T2
          ON ( T1.DATEANDTIME = T2.DATEANDTIME AND T1.MS = T2.MS AND T1.US = T2.US );

生产什么

2012-07-07 00:00:00.000 0   0   1   1   1   1869    11  2247
2012-07-07 00:00:00.000 0   588             1869    15  2247
2012-07-07 00:05:14.000 987 359             1869    13  2251
2012-07-07 00:05:16.000 45  493             1869    11  2247
2012-07-07 00:14:15.000 985 557             1869    11  2157
2012-07-07 00:14:16.000 945 179             1869    11  2279
2012-07-07 01:07:40.000 750 361 1   0   1           
2012-07-07 01:07:41.000 50  11  1   0   1           
2012-07-07 01:08:35.000 850 998 1   0   0           
2012-07-07 01:08:36.000 50  83  1   0   0           
2012-07-07 01:08:59.000 250 26  0   0   0           

注意:UNION 会删除重复项。我不使用完全外连接,因为它不受所有数据库的支持

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 2023-04-03
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    相关资源
    最近更新 更多