2010-03-21 19 views
18

Mam dwie tabele w bazie danych:PostgreSQL JOIN z typem tablicy z elementami tablicy, jak wykonać?

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

Ta tabela zawiera przyjść wiersz danych z unikalnym identyfikatorem.

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

);

Ta tabela zawiera pole typu tablicy. Każdy wiersz zawiera wartości identyfikatorów z tabeli items w określonej kolejności. Na przykład: {2,4,233,5}.

Teraz chcę uzyskać dane z tabeli items dla wybranego wiersza z tabeli some_chosen_data_in_order z zamówieniem dla elementów w typie tablicy.

Moja próba była DOŁĄCZ:

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

Druga próba była Podzapytanie jak:

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

Ale żaden z nich zachować identyfikatorów w tej samej kolejności, jak w polu tablicy. Czy możesz mi pomóc, jak uzyskać dane z tabeli items z korespondencją z identyfikatorami tablic z tabeli some_chosen_data_in_order dla konkretnego wiersza?

Odpowiedz

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

Powyższe zapytanie wybrać elementy z items tabeli z identyfikatorami: 1,2,3,2,3,5 w tej kolejności. Czy o to Ci chodziło? :)

+0

unnest() to naprawdę fajna sztuczka! Miałem listę identyfikatorów od klienta i musiałem się z nimi połączyć, ale chciałem znaleźć sposób na zrobienie tego bez tabeli tymczasowej. Możesz dołączyć (wybierz unnest (ARRAY [1,2,3])) jako idlist i działa jak mistrz. dzięki! – apinstein

+0

@apinstein czy możesz mi pokazać zapytanie? nadal dint dostać –

+1

Doskonała wskazówka, dzięki – Valentin

23

Prawdopodobnie normalizacja stołu byłaby najlepszą radą, jaką mogę ci dać.

Moduł cont_array contrib ma funkcję idx, która da ci pozycję indeksu int w tablicy. Istnieje również funkcja idx na snippets wiki, która działa dla tablic dowolnych typów danych.

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

Jest to dokładnie to, czego potrzebuję. Thanx! Denormalizuję swoją bazę danych ze względu na wydajność. – 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

Dodając kod jako odpowiedź, dodaj trochę wyjaśnienia do odpowiedzi dla przyszłych czytelników .. – HaveNoDisplayName

Powiązane problemy