2017-02-12 1 views
0

Первый запросPostgreSQL, как добавить результат к другому результату запроса

SELECT * FROM users WHERE _id = 1 

результат из запроса:

{ 
    username: "Test", 
    nickname: "somename" 
} 

Второй запрос

SELECT json_object_agg(permission, true) FROM user_permissions WHERE user_id = 1 

результат запроса:

{ 
    add: true, 
    delete: true, 
    somepermission: true 
} 

Третьего запрос

SELECT array_agg(number) FROM user_phone_numbers WHERE user_id = 1 

результата из запроса:

[ 
    00000-0000-000, 
    11111-1111-111 
] 

В основном я хочу, чтобы поместить результат второго и третьего запроса в первый запрос, так что конечный результат будет

{ 
    username: "Test", 
    nickname: "somename" 
    customJSONPermission: { 
     add: true, 
     delete: true, 
     somepermission: true 
    }, 
    customerArrayPhone: [ 
     00000-0000-000, 
     11111-1111-111 
    ] 
} 

Как создать единую команду SQL для обработки такого рода операций. Какие ключевые слова или функции я должен искать?

+0

Вы знакомы с 'JOIN'? –

+0

Привет, это не совсем верно? JOIN создаст много строк. Мне просто нужна одна строка с добавленными полями – Zanko

+0

Я думаю, что это может помочь: https://hashrocket.com/blog/posts/faster-json-generation-with-postgresql – McNets

ответ

2

Вы можете просто поставить все запросы в одном:

SELECT u.username, 
     u.nikname, 
     (SELECT json_object_agg(permission, true) FROM user_permissions WHERE user_id = u._id) AS customJSONPermission, 
     (SELECT array_agg(number) FROM user_phone_numbers WHERE user_id = u._id) AS customerArrayPhone 
    FROM users AS u 
WHERE u._id = 1 
+0

Спасибо за это! Думаю, это самый короткий путь? Что делать, если у моего userobject есть 100 полей, я должен написать очень длинный SQL, чтобы поместить u.field1, u.field2 ... u.field100? – Zanko

+0

Вы можете использовать u. *, Если хотите получить все поля в таблице –

+0

Perfect! Спасибо огромное! – Zanko