我有两个SQL查询:
以下查询以千位(13000)的形式返回记录并继续增长。
SELECT distinct city FROM users;
上述查询的结果将成为下一个SQL查询的参数:
SELECT CAST(users.lat as VARCHAR) AS latitude,
CAST(users.lng as VARCHAR) AS longitude,
users.city as city,
users.state as state
FROM users users
WHERE users .city='';
我通过使用IN
子句将第一个查询作为子查询来合并这两个查询,如下所示:
SELECT CAST(users.lat as VARCHAR) AS latitude,
CAST(users.lng as VARCHAR) AS longitude,
users.city as city,
users.state as state
FROM users users
WHERE users.city IN (SELECT distinct us.city FROM users us);
需要知道这是否可以进一步优化。
DDL:
CREATE TABLE users
(
id uuid NOT NULL,
language_id integer NOT NULL,
lat numeric NOT NULL,
lng numeric NOT NULL,
state character varying,
city character varying,
CONSTRAINT users_pkey PRIMARY KEY (id)
);
答案 0 :(得分:3)
第一条评论。使用distinct
时,您不需要in
。所以这个where
子句就足够了:
WHERE users.city IN (SELECT us.city FROM users us);
其次,使用不同的表名作为另一个表的别名是非常误导的。代替:
SELECT CAST(fru.lat as VARCHAR) AS latitude,
CAST(fru.lng as VARCHAR) AS longitude,
fru.city as city,
fru.state as state
FROM farmrise.users fru
WHERE fru.city IN (SELECT u.city FROM users u);
大多数数据库都会为此生成一个好的查询计划。就个人而言,我倾向于将其写成;
FROM farmrise.users fru
WHERE EXISTS (SELECT 1 FROM users u WHERE u.city = fru.city);
这肯定会利用users(city)
上的索引。
最后,在大多数数据库中,您需要VARCHAR
中CAST()
的长度。实际上,除了MySQL和衍生数据库之外,你应该在任何数据库中都有一个长度。