我有两个表TableA
和TableB
。我正在尝试使用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
和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
我没有得到我想要的。如何更改我的代码以仅将第一个更改的值插入到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 中已有的行。你也可以写这个来使用EXCEPT
或NOT 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))