" SELECT .. IN"的限制pgsql查询

时间:2012-09-27 00:53:26

标签: sql postgresql

我有一个包含大约14000个objectID的.csv文件。我的目标是检索与这些objectID关联的某些字段。到目前为止,我所做的是将所有objectID连接成一个以逗号分隔的列表,并附加到此查询的末尾:

SELECT objectName, objectType FROM objectTable WHERE objectID IN 1001, 1002, 1003... 

然而,这非常(非常)慢,因为我的数据库有大约1600万个唯一的objectID。有没有更好的方法来构建这样的查询?我必须分批运行吗? (我也试过这个但是速度难以忍受)或者我的整个方法都错了吗?

3 个答案:

答案 0 :(得分:2)

将objectID加载到表中,然后加入该表。

SELECT objectName, objectType
FROM objectTable INNER JOIN objectids ON (objecttable.objectid = objectids.id)

答案 1 :(得分:1)

w / 16m objectIDs,上传查询字符串可能需要花费更长的时间而不是实际运行它。

从CSV文件创建一个表,预先加载所有objectID。假设您将此表称为“objectIDs”,主行为“id”。现在你可以说:

SELECT objectName, objectType FROM objectTable
INNER JOIN objectIDs ON objectIDs.objectID=objectTable.objectID

内连接将自动剔除objectTable中任何未连接的东西,并将与您的ID表以1:1的关系加入。

答案 2 :(得分:1)

如果您已经有一个包含所有数字的逗号分隔字符串,则可以使用预准备语句 - 使用您使用的任何客户端的语法。纯SQL中的示例:

PREPARE myplan (text) AS
    SELECT o.objectname, o.objecttype
    FROM   (SELECT unnest(string_to_array($1, ','))::int AS objectid) x
    JOIN   objecttable o USING (objectid);

EXECUTE myplan('1001, 1002, 1003');

,如果您从数据库服务器上的有效CSV文件开始,请创建一个临时表,COPY数据({1}非常快),然后JOIN到它。

CREATE TEMP TABLE tmp_x (objectid int);

COPY tmp_x FROM '/path/to/my/file.csv';

    SELECT o.objectname, o.objecttype
    FROM   tmp_x
    JOIN   objecttable o USING (objectid);

DROP TABLE tmp_x;   -- optional; dropped automatically at end of session

如果您的文件位于其他计算机上,请改用COPY

你肯定有objecttable.objectid的索引吗?这是至关重要的。