在T-Sql中使用左连接仅插入一个/第一个记录

时间:2017-11-15 17:30:04

标签: sql sql-server tsql sql-server-2016

我有两张表TableATableB。我正在尝试使用leftjoin加入并将一些记录插入TableA

我的TableA

Time                             term_id   config1   config2    final
2017-04-19 23:59:00                 8        147       0        NULL
2017-04-19 23:59:00                 9        87        0        NULL
2017-04-19 23:59:00                10        284       0        NULL

我的TableB

Time                             term_id   config1   config2       Claims     Rejects
2017-04-20 00:00:00                8         148       0            568.2        62
2017-04-20 01:00:00                8         148       0            569          62
2017-04-20 02:00:00                8         148       0            572          62
2017-04-20 00:00:00                9         88        0            458          12
2017-04-20 01:00:00                9         88        0            459          12
2017-04-20 02:00:00                9         88        0            462          12
2017-04-20 00:00:00               10         285       0            125          13
2017-04-20 01:00:00               10         285       0            123          13
2017-04-20 02:00:00               10         285       0            117          13
2017-04-20 03:00:00               10         286       1            119          13

我想要的输出是,

Time                           term_id         config1     config2     final
2017-04-19 23:59:00                 8            147           0        NULL
2017-04-19 23:59:00                 9            87            0        NULL
2017-04-19 23:59:00                 10           284           0        NULL
2017-04-20 00:00:00                 8            148           0         1
2017-04-20 00:00:00                 9            88            0         1
2017-04-20 00:00:00                 10           285           0         1
2017-04-20 03:00:00                 10           286           1         1

我只想将config1中的config2更改从TableB插入TableA。所以,我做了这样的左连接,(我不需要来自Claims的{​​{1}}和Rejects

TableB

我没有得到我想要的东西。如何更改我的代码以仅获取插入insert into TableA select B.[time], B.term_id, B.Config1, B.config2, (CASE WHEN B.config1 <> A.config1 OR B.config2 <> A.config2 THEN 1 ELSE 0 END) from TableB B left join (select max([time]) as maxtime, term_id, config1, config2 from TableA group by [time], term_id, config1, config2 ) as A on A.term_id = B.term_id 的第一个更改值?

3 个答案:

答案 0 :(得分:2)

现在我可以更仔细地查看示例数据和输出,我可以更好地看到您想要的内容(并且它与现有代码无关)。

由于您正在进行INSERT,基于示例,看起来就像这样:

INSERT INTO TableA
SELECT MIN([time]) as ConfigTime, term_id, config1, config2, 1
FROM TableB
GROUP BY term_id, config1, config2

由于它已添加到您已有的内容中,因此它应在表格中生成预期结果(即:SELECT * FROM TableA将在此次运行后产生您想要的结果。

但如果你担心在TableA中意外产生重复记录,你可以这样做:

INSERT INTO TableA
SELECT B.*, 1
FROM (
    SELECT MIN([time]) as ConfigTime, term_id, config1, config2
    FROM TableB
    GROUP BY term_id, config1, config2
) B
LEFT JOIN TableA A ON a.term_id = B.term_id
     AND A.config1 = B.config1 AND A.config2 = B.config2
WHERE A.[time] iS NULL

这将从TableB获取结果并执行排除连接以删除TableA中已有的行。你也可以写这个来使用EXCEPTNOT EXISTS(),我更乐于编写排除连接。

答案 1 :(得分:0)

time移除group by。我猜这个FROM子句可以做你想要的:

from TableB B left join 
     (select max([time]) as maxtime, term_id, config1, config2
      from TableA
      group by term_id, config1, config2
     ) A
     on A.term_id = B.term_id

答案 2 :(得分:0)

这类似于Joel Coehoorn的更新查询,但仍然有点不同:

INSERT INTO tablea
SELECT 
    min_time, b.term_id, b.config1, b.config_2, 1 as final
FROM
    (SELECT 
        term_id, config1, config_2, 
        MIN(TIME) AS min_time
    FROM
        tableb
    GROUP BY
        term_id, config1, config_2) b INNER JOIN
    tablea a ON
    b.termid = a.termid AND
    ((b.config1 <> a.config1) OR
    (b.config2 <> a.config2))