我有两张表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
的{{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
的第一个更改值?
答案 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中已有的行。你也可以写这个来使用EXCEPT
或NOT 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))