SQL - 从CSV文件加载数据&使用该数据查找另一个表

时间:2017-07-13 16:31:59

标签: sql csv psql

我是SQL的新手,我想知道是否有任何方法可以在表中搜索具有外部表(csv文件)列值的实例。为了更清楚地解释这一点,我正在研究的是:如果csv文件中的列包含纬度而另一列包含经度;我想搜索一个表格,其中包含有关多个地点的信息,并在表格中指定了纬度和经度。

我想从纬度和经度中检索有关该特定位置的信息作为csv文件的输入。

看起来像这样吗? :

CREATE TABLE MyTable(  
  latitude DECIMAL(5, 2) NOT NULL, 
  longitude DECIMAL(5, 2) NOT NULL
);

LOAD DATA INFILE 'C:\Users\Admin\Desktop\Catalog.csv'
INTO TABLE MyTable
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'

SELECT
  main.object_id, 
  main.latitude, 
  main.longitude, 
  main.Some_Information

FROM
  location_info AS main,
  MyTable AS temp

WHERE
  main.latitude = temp.latitude AND
  main.longitude = temp.longitude

我也尝试过使用psql的\ copy,如:

\copy MyTable FROM 'C:\Users\Admin\Desktop\Catalog.csv' WITH CSV;

如此处所示 - > http://postgresguide.com/utilities/copy.html。 但这也不起作用。复制时或附近的“\”附近有错误,但这可能是因为存在较旧版本的psql。 此外,我不是超级用户,因此使用\ copy而不是COPY FROM。

我还尝试使用临时表并在其旁边使用\ copy。它给出了与上面相同的错误。

1 个答案:

答案 0 :(得分:0)

PostgreSQL不支持您正在使用的LOAD DATA语法。您需要改为使用COPY

您的工作流程应该更像:

CREATE TABLE MyTable(  
  latitude DECIMAL(5, 2) NOT NULL, 
  longitude DECIMAL(5, 2) NOT NULL
);

COPY MyTable(latitude, longitude) 
FROM 'C:\Users\Admin\Desktop\Catalog.csv' WITH CSV;

SELECT
  main.object_id, 
  main.latitude, 
  main.longitude, 
  main.Some_Information
FROM
  location_info AS main
  JOIN MyTable AS temp
    on main.latitude = temp.latitude 
    and main.longitude = temp.longitude  

这里有三点需要注意。

  1. 我已从\命令中删除了COPY
  2. 我已经使用COPY命令指定了您要插入的列。如果CSV文件中的列的顺序不同,只需在COPY表达式中重新排序。
  3. 我已将您的联接语法更改为标准ANSI联接。逻辑是相同的,但出于可读性/兼容性的原因,这是一个更好的标准。