2016-12-10 12 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) 

私はそれがかなり奇妙な例ですが、知っているだけで、私は何を意味するか見せたかったです。 このようなクエリを実行すると、サブクエリのpテーブルの出現の代わりにtable or view does not existが得られます。 インラインビューの処理方法を誤解していると思います。 '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を必要とします。 にGROUP BYが指定されていないとエラーになります。
  • COUNT(DISTINCT)は不要です。追加のオーバーヘッドがあるため、回避するのが最善です。
  • 外側のクエリのロジックにはおそらくかっこが必要です(ペットを持たない父親が欲しい場合を除きます)。
  • 私はテーブルエイリアスの使用を強く好みます。
関連する問題