如何在pgsql查询结果中获取多行

时间:2017-01-09 15:43:15

标签: postgresql

我正在使用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


编辑:   
上面的语句在一个过程中被调用,该过程将查询的响应添加到主表

1 个答案:

答案 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 |
+----------+--------+-----------------+---------------+