2016-12-10 4 views
0

Возможно ли сопоставить подзапрос с встроенным представлением?Связанные подзапросы с встроенным представлением в качестве внешнего запроса

Предположим, у нас есть простая база данных, в которой хранится информация о владельцах домашних животных.

SELECT p.name, 
     p.surname, 
     p.num_of_pets 
    FROM (SELECT person.id_person id_person, 
       person.name  name, 
       person.surname surname, 
       COUNT(DISTINCT person_pets.id_pet) num_of_pets 
      FROM person 
       LEFT JOIN person_pets 
         ON person.id_person=person_pets.id_person) p 
    WHERE EXISTS(SELECT 1 
       FROM person p1 
       WHERE p1.father=p.id_person 
        OR p1.mother=p.id_person 
        AND p.num_of_pets > 2) 

Я знаю, что это довольно странный пример, но мне хотелось только показать, что я имею в виду. Когда я запускаю такой запрос, я получаю table or view does not exist вместо места p-таблицы в подзапросе. Я полагаю, я неправильно понимаю, как обрабатываются встроенные представления. Существуют ли ограничения в использовании по сравнению с представлениями, созданными с помощью 'with' или 'create view' или существующих таблиц?

+0

[Да, вы можете.] (Http://rextester.com/LQZT12754). Об ошибке. Проверьте правильность написания имен таблиц и добавьте предложение 'group by' к встроенному представлению. –

ответ

1

Я подозреваю, что вы собираетесь это:

SELECT p.name, p.surname, p.num_of_pets 
FROM (SELECT p.id_person, p.name, p.surname, 
      COUNT(pp.id_person) as num_of_pets 
     FROM person p LEFT JOIN 
      person_pets pp 
      ON p.id_person = pp.id_person 
     GROUP BY p.id_person, p.name 
    ) p 
WHERE EXISTS (SELECT 1 
       FROM person p1 
       WHERE (p1.father = p.id_person OR p1.mother = p.id_person) AND 
        p.num_of_pets > 2 
      ); 

Я не уверен, почему вы получаете эту конкретную ошибку, но некоторые примечания:

  • подзапросу нужны GROUP BY синтаксический правильно , Ошибка COUNT() без GROUP BY.
  • Вам не нужно COUNT(DISTINCT). У этого есть дополнительные накладные расходы, поэтому лучше обойти это.
  • Логика во внешнем запросе, вероятно, нуждается в круглых скобках (если вы не хотите отцов без домашних животных).
  • У меня есть сильное предпочтение использованию псевдонимов таблиц.
Смежные вопросы