【问题标题】:Correlated subqueries with inline view as outer query将内联视图作为外部查询的相关子查询
【发布时间】:2016-12-10 21:14:20
【问题描述】:

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

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

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”创建的视图或现有表相比,在使用上是否有任何限制?

【问题讨论】:

  • Yes you can. 。关于错误。检查表名的拼写并在内联视图中添加group by 子句。

标签: sql oracle correlated-subquery


【解决方案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 才能在语法上正确。没有GROUP BYCOUNT() 应该会导致错误。
  • 你不应该需要COUNT(DISTINCT)。它有额外的开销,所以最好避开它。
  • 外部查询中的逻辑可能需要括号(除非您想要没有宠物的父亲)。
  • 我非常喜欢使用表别名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多