【发布时间】:2016-06-26 21:11:58
【问题描述】:
我在 PostgreSQL 中的 INSERT 有问题。我有这个问题:
INSERT INTO track_segments(tid, gdid1, gdid2, distance, speed)
SELECT * FROM (
SELECT DISTINCT ON (pga.gdid)
pga.tid as ntid,
pga.gdid as gdid1, pgb.gdid as gdid2,
ST_Distance(pga.geopoint, pgb.geopoint) AS segdist,
(ST_Distance(pga.geopoint, pgb.geopoint) / EXTRACT(EPOCH FROM (pgb.timestamp - pga.timestamp + interval '0.1 second'))) as speed
FROM fl_pure_geodata AS pga
LEFT OUTER JOIN fl_pure_geodata AS pgb ON (pga.timestamp < pgb.timestamp AND pga.tid = pgb.tid)
ORDER BY pga.gdid ASC) AS sq
WHERE sq.gdid2 IS NOT NULL;
用成对连接的地理点段填充表格。当我单独运行 SELECT 时,我得到了正确的配对,但是当我在上面的语句中使用它时,有些配对方式错误或根本不配对。这就是我的意思:
单独选择的结果:
tid;gdid1;gdid2;distance;speed
"0f6fd522-5f1e-49a4-b85e-50f11ef7f908";10;11;34.105058803;31.0045989118182
"0f6fd522-5f1e-49a4-b85e-50f11ef7f908";11;12;90.099603143;14.7704267447541
"0f6fd522-5f1e-49a4-b85e-50f11ef7f908";12;13;23.331326565;21.2102968772727
使用相同的 SELECT 插入后的结果:
tid;gdid1;gdid2;distance;speed
"0f6fd522-5f1e-49a4-b85e-50f11ef7f908";10;12;122.574;17.2639603638028
"0f6fd522-5f1e-49a4-b85e-50f11ef7f908";11;12;90.0996;14.7704267447541
"0f6fd522-5f1e-49a4-b85e-50f11ef7f908";12;13;23.3313;21.2102968772727
这是什么原因? INSERT 的 SELECT 语句完全相同,为什么会给出不同的结果?
【问题讨论】:
-
顺便说一句:
WHERE sq.gdid2 IS NOT NULL;有效地将左连接转换为普通连接。 -
注 2:
(pga.timestamp < pgb.timestamp AND pga.tid = pgb.tid)连接条件在每个 tid 产生一个 (N*(N-1)/2) 大小的 (partial) carthesian produkt。这就是你想要的吗? -
@joop 哦,没错。我最初想显示空值,以查看最后一个点是否正确连接到具有不同 tid 的下一个点。我写的时候有点晚了,忘记了 JOIN。谢谢指正!
标签: database postgresql select sql-insert