使用内联视图作为外部查询的相关子查询

时间:2016-12-10 21:14:21

标签: sql oracle correlated-subquery

是否可以将子查询与内联视图相关联?

假设我们有一个简单的数据库来存储有关宠物主人的信息。

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)

我知道这是一个非常奇怪的例子,但只是想表明我的意思。 当我运行这样的查询时,我在子查询中的p表发生位置得到table or view does not exist。 我想我误解了如何处理内联视图。 与使用'创建的视图相比,使用是否有任何限制?或者'创建视图'还是现有的桌子?

1 个答案:

答案 0 :(得分: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()的{​​{1}}会导致错误。
  • 你不应该GROUP BY。它有额外的开销,所以最好绕过它。
  • 外部查询中的逻辑可能需要括号(除非你想要没有宠物的父亲)。
  • 我非常喜欢使用表别名。