2014-01-28 3 views
0

У меня есть множество кортежейВозврат как отображенное значение и переданное значение в SQL для каждой строки

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

и у меня есть таблица в базе данных PostgreSQL с колонками

| tuple_id | project_id | 

кортежи созданный внешним приложением и передаваемый в виде потока данных.

Что мне нужно сделать сейчас - это карта идентификатор из кортежа PROJECT_ID из базы данных, поэтому он будет производить

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

где M < = N - не каждый входной кортеж имеет соответствующее сопоставление в таблице.

Если мне нужно будет получить только идентификатор отображения - то я сделал бы что-то вроде

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

Вы можете использовать обертку иностранных данных (ИДП), чтобы прочитать файл, как если бы он был таблицей базы данных, а затем присоединить его к таблице сопоставлений идентификаторов.

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», кстати. –