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



我有两个表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中的更改,config2TableB插入到TableA中。所以,我像这样做了一个左联接,(我不需要ClaimsRejects 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

没有得到我想要的。如何更改我的代码以仅将第一个更改的值插入到TableA中?

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

由于您正在执行 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(),我只是更愿意写排除连接。

group by中删除time。 我猜这个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
这与

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))

最新更新