2010-03-21 31 views
18

Tengo dos tablas en la base de datos:PostgreSQL JOIN con tipo de matriz con orden de elementos de matriz, ¿cómo implementarlo?

CREATE TABLE items(
id SERIAL PRIMARY KEY, 
... some other fields 
); 

Esta tabla contiene vienen fila de datos con la identificación única.

CREATE TABLE some_chosen_data_in_order(
id SERIAL PRIMARY KEY, 
id_items INTEGER[], 

);

Esta tabla contiene el tipo de campo de matriz. Cada fila contiene valores de identificadores de la tabla items en un orden específico. Por ejemplo: {2,4,233,5}.

Ahora, quiero obtener datos de la tabla items para la fila elegida de la tabla some_chosen_data_in_order con el fin de elementos en tipo de matriz.

Mi intento fue JOIN:

SELECT I.* FROM items AS I 
JOIN some_chosen_data_in_order AS S ON I.id = ANY(S.id_items) WHERE S.id = ? 

segundo intento fue subconsulta como:

SELECT I.* FROM items AS I 
WHERE I.id = ANY 
(ARRAY[SELECT S.id_items FROM some_chosen_data_in_order WHERE id = ?]) 

Pero ninguno de ellos mantienen los identificadores en el mismo orden que en el campo de matriz. ¿Podría ayudarme, cómo obtener datos de la tabla items con correspondencia con las ID de matriz, ordenar desde la tabla some_chosen_data_in_order para una fila específica?

Respuesta

43
SELECT t.* 
FROM unnest(ARRAY[1,2,3,2,3,5]) item_id 
LEFT JOIN items t on t.id=item_id 

la consulta anterior para seleccionar elementos de items mesa con ID: 1,2,3,2,3,5 en ese orden. ¿Es eso lo que quieres decir? :)

+0

unnest() es un truco genial! Tenía una lista de identificación de un cliente y necesitaba unirme a ellos, pero quería encontrar una manera de hacerlo sin una tabla temporal. Puedes unirte (selecciona unnest (ARRAY [1,2,3])) como idlist y funciona como un campeón. ¡Gracias! – apinstein

+0

@apinstein ¿me puede mostrar la consulta? todavía no lo entiendo –

+1

Consejo excelente, gracias – Valentin

23

Probablemente la normalización de su mesa sea el mejor consejo que pueda darle.

El módulo contrib de int_array tiene una función idx que le dará la posición de índice de int en la matriz. También hay una función idx en el snippets wiki que funciona para matrices de cualquier tipo de datos.

SELECT i.*, idx(id_items, i.id) AS idx 
FROM some_chosen_data_in_order s 
JOIN items i ON i.id = ANY(s.id_items) 
ORDER BY idx(id_items, i.id) 
+1

Es claramente lo que necesito. Gracias! Estoy desnormalizando mi base de datos debido a razones de eficiencia. – Adiasz

0
SELECT I.* FROM items AS I 
WHERE I.id IN (SELECT UNNEST(id_items) FROM some_chosen_data_in_order 
(ARRAY[SELECT S.id_items FROM some_chosen_data_in_order WHERE id = ?]) 
+1

Cuando agregue código como respuesta, agregue una explicación de bit a su respuesta para lectores futuros. – HaveNoDisplayName

Cuestiones relacionadas