来自SQLite的等效PostgreSQL查询

时间:2018-10-28 09:07:44

标签: sql ruby-on-rails postgresql sqlite

我是一名移动开发人员,但是最近我一直在做一些服务器工作,所以请原谅我的术语,等等。我一直在研究SQLite之间的区别(??)。在iOS / Android上使用)和PostgreSQL(我在API中使用)。

在SQLite中,我可以从表中SELECT *,然后GROUP BY单个列,而根本没有任何聚合函数。但是,在PostgreSQL中,它总是抱怨它需要group by中的列或agg函数。

假设我有一个stop_times表,该表包含以下列:stop_idtrip_idstop_sequencedeparture_time。我的trips表有一个trip_id列和route_id。在SQLite中,我有一个如下查询:

SELECT * FROM "stop_times" 
  INNER JOIN "trips" ON "stop_times"."trip_id" = "trips"."trip_id" 
  WHERE "stop_times"."stop_id" IN (?, ?, ?) 
  GROUP BY "stop_times"."stop_id", "trips"."route_id"

(我正在尝试确定沿其停靠的任何路线的一组特定停靠点的stop_sequence。)但是,在PostgreSQL中,这似乎没有用,因为直到我抱怨将stop_times的每一列放入group by子句或聚合函数。当我这样做时,我从数据库中获得的信息是无用的(在Rails中,它只是一堆空对象:#<StopTime >)。

如何使用Postgres实现与上述相同的功能?

1 个答案:

答案 0 :(得分:1)

您需要将列列表与GROUP BY匹配:

SELECT "stop_times"."stop_id", "trips"."route_id" 
FROM "stop_times" 
INNER JOIN "trips" ON "stop_times"."trip_id" = "trips"."trip_id" 
WHERE "stop_times"."stop_id" IN (?, ?, ?) 
GROUP BY "stop_times"."stop_id", "trips"."route_id"

distinct on

SELECT DISTINCT ON("stop_times"."stop_id", "trips"."route_id") *
FROM "stop_times" 
INNER JOIN "trips" ON "stop_times"."trip_id" = "trips"."trip_id" 
WHERE "stop_times"."stop_id" IN (?, ?, ?)