postgresql 错误:用作700k行的表达式的子查询返回了多行

bnl4lu3b  于 2023-04-11  发布在  PostgreSQL
关注(0)|答案(1)|浏览(201)

我有两个表'trip_history'和'dap_iot_stdd_details'。
trip_history表有trip_id列,而dap_iot_stdd_details表有trip_id, dap_iot_stdd_id, added_on, "timestamp"
我只想使用trip_history表中的trip_id从dap_iot_stdd_details中提取数据。
我试图执行这个

select dap_iot_stdd_id, added_on, "timestamp"
from public.dap_iot_stdd_details
where dap_iot_trip_id = (
  select trip_id
  from public.trip_history
  where start_time between '1680307200000' and '1680912000000'
  order by start_time asc
);

我得到了Error "more than one row returned by a subquery used as an expression",正如预期的那样。
我想知道是否有更好的方法来重新创建此查询。
请注意,有超过700k的trip id,需要从dap_iot_stdd_details中获取相应的数据。我是Postgresql的初学者。如果我做错了什么,请告诉我。

wydwbb8l

wydwbb8l1#

您会收到错误,原因如下:

where dap_iot_trip_id = (
  select trip_id ...

此上下文中的子查询(select trip_id ..)只能返回一个有效值。
正如@Bergi提到的,你可以将Subquery expression改为:

where dap_iot_trip_id IN (
  select trip_id ...

阅读链接中的文档以了解注意事项。
或者你也可以将查询转换为JOIN形式,如建议的:

SELECT 
    dap_iot_stdd_id, added_on, "timestamp"
FROM 
    public.dap_iot_stdd_details AS detail 
JOIN
    public.trip_history AS history
ON
    detail.dap_iot_trip_id = history.trip_id
WHERE 
    history.start_time BETWEEN '1680307200000' AND '1680912000000'
ORDER BY 
    start_time asc

相关问题