我正在使用pgsql 9.3。
我有两张相同的桌子。一个是主表,另一个是临时表。每次有更新时,数据都会写入临时表,如果主数据中没有数据,则会将数据写入其中。
如果在temp中只有一个条目,那么我得到了所需的结果,即,如果该条目不在master中,则插入它。但是如果我在temp中有多行,我的逻辑就会失败。任何人都可以帮助我。以下是我正在执行的stataemnt
select type, number, id, max(time) from testt t
where not exists (
select 1 from testm m
where (
m.id = t.id and m.type = t.type and m.number = t.number
and
(
m.time = (select max(m1.time) from testm m1 where m.id=m1.id
)
)
)
)
group by id, type, number;
感谢任何帮助。提前谢谢。
编辑:
主表中的数据:
type | number | id | time
--------------+---------------+-----------------+---------------
35817804 | 158014 | 262017400998389 | 1483336800000
35817804 | 158024 | 262017400998389 | 1483337400000
35817804 | 158014 | 262017400998389 | 1483338000000
35817804 | 158024 | 262017400998389 | 1483338900000
临时表中的数据:
type | number | id | time
---------+---------------+-----------------+---------------
35817804 | 158014 | 262017400998389 | 1483339500000
35817804 | 158024 | 262017400998389 | 1483340100000
在temp中,两个行的时间不同,并且master中不存在这些组合。因此,两者都应插入到制作大师中,如下所示
type | number | id | time
---------+---------------+-----------------+---------------
35817804 | 158014 | 262017400998389 | 1483336800000
35817804 | 158024 | 262017400998389 | 1483337400000
35817804 | 158014 | 262017400998389 | 1483338000000
35817804 | 158024 | 262017400998389 | 1483338900000
35817804 | 158014 | 262017400998389 | 1483339500000
35817804 | 158024 | 262017400998389 | 1483340100000
但在运行上述查询后,我的主人员填充了以下数据,缺少最后一个条目
type | number | id | time
---------+---------------+-----------------+---------------
35817804 | 158014 | 262017400998389 | 1483336800000
35817804 | 158024 | 262017400998389 | 1483337400000
35817804 | 158014 | 262017400998389 | 1483338000000
35817804 | 158024 | 262017400998389 | 1483338900000
35817804 | 158014 | 262017400998389 | 1483339500000
编辑:
上面的语句在一个过程中被调用,该过程将查询的响应添加到主表
答案 0 :(得分:0)
我设置了rextester示例:http://rextester.com/TJLG3973
我使用CTE查询避免了select max(time)
在哪里条件。与where m.type is null
一起使用的LEFT JOIN返回不存在的记录。
with trecords as
(
select t.type, t.number, t.id, max(t.time) as time
from testt t
group by t.type, t.number, t.id
)
insert into testm
select x.type, x.number, x.id, x.time
from trecords x
left join testm m
on m.type = x.type
and m.number = x.number
and m.id = x.id
and m.time = x.time
where m.type is null
;
我在temp表中添加了两行,只是为了检查max(时间)是否正常工作。
create temp table testt (type int, number int, id bigint, time bigint);
insert into testt values
(35817804, 158014, 262017400998389, 1483339500000),
(35817804, 158014, 262017400998389, 1483339600000),
(35817804, 158014, 262017400998389, 1483339700000),
(35817804, 158024, 262017400998389, 1483340100000);
主表提供了问题:
create temp table testm (type int, number int, id bigint, time bigint);
insert into testm values
(35817804, 158014, 262017400998389, 1483336800000),
(35817804, 158024, 262017400998389, 1483337400000),
(35817804, 158014, 262017400998389, 1483338000000),
(35817804, 158024, 262017400998389, 1483338900000);
这是最终结果:
+----------+--------+-----------------+---------------+
| type | number | id | time |
+----------+--------+-----------------+---------------+
| 35817804 | 158014 | 262017400998389 | 1483336800000 |
+----------+--------+-----------------+---------------+
| 35817804 | 158024 | 262017400998389 | 1483337400000 |
+----------+--------+-----------------+---------------+
| 35817804 | 158014 | 262017400998389 | 1483338000000 |
+----------+--------+-----------------+---------------+
| 35817804 | 158024 | 262017400998389 | 1483338900000 |
+----------+--------+-----------------+---------------+
| 35817804 | 158024 | 262017400998389 | 1483340100000 |
+----------+--------+-----------------+---------------+
| 35817804 | 158014 | 262017400998389 | 1483339700000 |
+----------+--------+-----------------+---------------+