2014-01-28 58 views
0

我的元组在SQL返回都映射值和传递价值的每一行

(id1, count1),(id2, count2) ... (idN, countN) 

的,我必须在PostgreSQL数据库的表中的列

| tuple_id | project_id | 

的元组是由外部应用程序生成并作为数据流传递。

我现在需要做的是什么 - 是元组的ID映射到PROJECT_ID从数据库中,所以它会产生

(projectid1, count1), (projectid2, count2) ... (projectidM, countM) 

其中中号< = N - 不是每一个输入元组在表中有适当的映射。

如果我需要得到唯一ID映射 ​​- 然后我会做类似

SELECT project_id FROM tablename WHERE tuple_id IN (.....) 

不过,我需要得到 PROJECT_ID和计数值。有没有其他的方式来实现,而不需要创建临时表,然后用流中的数据填充它?

采样输入数据(文本文件)

1,10 
2,15 
3,14 

数据映射(PostgreSQL表)

1, 37f6e23f-ef50-4c6f-a746-cb29ae3adf52 
2, 8c73500f-2118-4bb7-b470-78ac1878896e 
3, c28b19f2-9ec7-4278-ae02-1dbb39d6113d 

预期结果:

37f6e23f-ef50-4c6f-a746-cb29ae3adf52, 10 
8c73500f-2118-4bb7-b470-78ac1878896e, 15 
c28b19f2-9ec7-4278-ae02-1dbb39d6113d, 14 
+0

当然,请看看更新 – jdevelop

+0

是的,我想避免创建临时表。 – jdevelop

回答

2

你可以使用一个外部数据封装器(FDW )像读取数据库表一样读取文件,然后将其与您的ID映射表一起加入。

file fdw看起来很适合这项工作。

这似乎工作:

CREATE TABLE mappings(id INT PRIMARY KEY, project_id UUID); 
INSERT INTO mappings(id,project_id) VALUES 
    (1, '37f6e23f-ef50-4c6f-a746-cb29ae3adf52'), 
    (2, '8c73500f-2118-4bb7-b470-78ac1878896e'), 
    (3, 'c28b19f2-9ec7-4278-ae02-1dbb39d6113d'); 

CREATE EXTENSION file_fdw; 
CREATE SERVER filedata FOREIGN DATA WRAPPER file_fdw; 
CREATE FOREIGN TABLE textfile (tupleid int, id_count int) 
    SERVER filedata OPTIONS (filename '/tmp/test1.txt', format 'csv'); 

SELECT project_id, id_count 
    FROM textfile 
    LEFT join mappings on textfile.tupleid=mappings.id; 

       project_id    | id_count 
--------------------------------------+---------- 
37f6e23f-ef50-4c6f-a746-cb29ae3adf52 |  10 
8c73500f-2118-4bb7-b470-78ac1878896e |  15 
c28b19f2-9ec7-4278-ae02-1dbb39d6113d |  14 
(3 rows) 

的文件,似乎外籍家政工人的文件格式有点挑剔。我发现最后一个空行导致它失败。

0

嗯,我知道这是愚蠢的,但它回答了这个问题:所有必要的信息以单查询检索,没有创建的临时表:

select project_id, 
    (CASE tuple_id WHEN 1 THEN 10 WHEN 2 THEN 15 WHEN 3 THEN 14 END) as count 
from tablename where tuple_id in (1,2,3) 

所有你需要的是产生简单的CASE语句。

我相信在用很多tuple_ids调用时可能会很慢,但是您没有提及任何有关限制/大小的内容。

+1

通过使用'VALUES'子句的连接来做到这一点会更简洁,顺便说一句。 –