2016-03-10 2 views
0

У меня есть таблица «Автомобили» и таблица «Лицо». Человек управляет многими автомобилями, а автомобиль может управляться многими людьми, поэтому у меня есть еще одна таблица «Person_Car», в которой есть как id для каждой строки.PostgreSQL: Получить сущность со всеми его отношениями

Car(id, name) 
Person(id, name) 
Person_Car(car_id, person_id) 

Как я могу получить список всех людей с автомобилями стимулируется (имена автомобилей сцеплены), что-то вроде этого:

("John", "Car 1, Car 2, Car 3") 
("Kate", "Car 2, Car 4, Car 5") 
+1

Что SQL делать вам хав до сих пор? –

+0

Вы можете использовать внутреннее соединение, а затем postgresql-group-concat-эквивалент из этого ответа: http://stackoverflow.com/a/2561297/2253302 –

ответ

0

Пример здесь: http://sqlfiddle.com/#!15/ba949/1

Тестовые данные:

Create table Car(id int, name text); 
Create table Person(id int, name text); 
Create table Person_Car(car_id int, person_id int); 

INSERT INTO Car VALUES (1, 'Car 1'), 
    (2, 'Car 2'), 
    (3, 'Car 3'), 
    (4, 'Car 4'), 
    (5, 'Car 5'); 

INSERT INTO Person VALUES(1, 'John'), (2, 'Kate'); 

INSERT INTO Person_Car VALUES (1,1), (2,1), (3,1), (2,2), (4,2), (5,2); 

Ваш желаемый код:

SELECT p.name, array_to_string(array_agg(c.name), ',') FROM Person p 
    INNER JOIN Person_Car pc ON p.id=pc.person_id 
    INNER JOIN Car c ON c.id=pc.car_id 
    GROUP by p.name 

Выход:

John Car 1,Car 2,Car 3 
Kate Car 2,Car 4,Car 5 
0

Только в случае, если вы хотите избежать GROUP BY

Вариант 1

WITH forienKeyTable AS 
(
    SELECT pc.person_id, c.name 
    FROM Car c 
    JOIN Person_Car pc ON pc.car_id = c.id 
) 
SELECT p.name 
    , array_to_string 
     (ARRAY(
      SELECT fkt.name 
      FROM forienKeyTable fkt 
      WHERE fkt.person_id = p.id 
     )::text[], ','::text, 'empty'::text) 
FROM Person p; 

Вариант 2

SELECT p.name 
    , array_to_string 
     (ARRAY(
      SELECT c.name 
      FROM Car c 
      JOIN Person_Car pc ON pc.car_id = c.id 
      WHERE pc.person_id = p.id 
     )::text[], ','::text, 'empty'::text) 
FROM Person p; 
Смежные вопросы