Как получить данные только один раз и использовать их в запросе объединения

#sql #db2 #union

#sql #db2 #объединение

Вопрос:

Мой запрос для получения человека и информации о его друге или родителе:

 select civils.name, friends.fullName as full_name, friends.age as age, friends.height as height 
from (query to get list people in city) as civils
inner join friends on civils.friendId = friends.Id and friends.name = "John"
union
select civils.name, parents.fullName as full_name, parents.age as age, parents.height as height 
from (query to get list people in city) as civils
inner join parents on civils.parentId = parents.Id and parents.name = "John"
  

Но я не хочу тратить ресурсы на повторное получение civils. Как получить данные списка за один раз и использовать их для двух внутренних объединений, подобных этому:

 select civils.name, full_name, age, height from (query to get list people in city) as civils
inner join friends on civils.friendId = friends.Id and friends.name = "John"
union
inner join parents on civils.parentId = parents.Id and parents.name = "John"
  

Я использую DB2.

Обновлено: Извините за неясный вопрос, я ожидаю, что результат будет выглядеть следующим образом:

 civils.name | full_name | age | height
  

Но если бы я попробовал решения, подобные предложенным ответам, формат результата был бы:

 civils.name | friends.full_name | friends.age | friends.height | parents.full_name | parents.age | parents.height
  

и мне нужно сделать еще один шаг, чтобы преобразовать этот список в мой ожидаемый формат list.

Ответ №1:

Я немного обеспокоен тем, что вы можете делать в своей civils ссылке, но вы можете обернуть это как CTE:

 WITH Civil_List AS (<query to get list people in city>) 

SELECT Civils.name, Friends.full_name, Friends.age, Friends.height
FROM Civils_List
JOIN Friends 
  ON Friends.id  = Civils_List.friendId
     AND Friends.name = 'John' 
UNION 
SELECT Civils.name, Parents.full_name, Parents.age, Parents.height
FROM Civils_List
JOIN Parents 
  ON Parents.id  = Civils_List.friendId
     AND Parents.name = 'John' 
  

Комментарии:

1. Если у вас нет способа сделать это в одном запросе, я буду использовать ваш запрос. Это охватывает все случаи.

2. @qmn1711 — Список желаемых результатов был важной информацией. Изначально мы думали, что вы просто ищете существование этих записей, а не какие-либо значения из них (или необходимый формат).

3. да, я пропустил эту важную информацию. Я использовал ваш запрос в своем приложении, спасибо!