2016-07-06 3 views
-4

このクエリをINNER JOINのない同等のものに変換しようとしています。INNER JOINのない同じクエリですか?

select c.name, c.area, ai.sum_area 
from 
    country as c 
    inner join (
     select sum(i.area) as sum_area, gi.country 
     from 
      island i 
      inner join 
      geo_island gi on (i.name = gi.island) 
     group by gi.country 
    ) as ai on (c.code = ai.country) 
where (c.area * 0.99) <= ai.sum_area; 

私が行う方法を学習したいのですが、私はこの文で unconfortable本当に感じるが、多くの場合、私はクエリを記述するために見つける唯一の方法です。

編集: 私は-1を置くのではなく、誰かが何が問題なのか教えていただきたいと思います。

+2

なぜあなたはINNER JOINを削除しようとしていますか?あなたがここで解決しようとしている問題は何ですか? –

+0

私はここでクエリに問題はありません。 正しいです。 私は、INNER JOINを使わずに同じことを書く別の方法を探してみたいです。 – user3004162

+0

あなたが結合を削除すると、それは同じことではありません - それは本当に明確ではありませんなぜ*なぜあなたは結合を排除したいですか? 2つの質問でタグ付けしているので、使用しているデータベースを知ることも便利です。 –

答えて

0

一つの選択肢は、「古い」を使用することである - 非ANSI SQL準拠の構文に参加:

select c.name, c.area, ai.sum_area 
from country as c, 
    (
     select sum(i.area) as sum_area, gi.country 
     from island i, 
     geo_island gi 
     where (i.name = gi.island) 
     group by gi.country 
) as ai 
where (c.area * 0.99) <= ai.sum_area 
    and c.code = ai.country; 

他の選択肢はいくつかのサブクエリ(依存と依存しない)とオペレータを使用することです。

SELECT * FROM (
    select c.name, c.area, 
      (   
       select sum(i.area) as sum_area 
       from island i 
       WHERE i.name IN (SELECT island FROM geo_island) 
        AND i.country = c.code 
      ) as sum_area 

    from country as c 
) x 
where (area * 0.99) <= sum_area; 
+0

これはまだ内部結合ですが、 –

+0

2番目の例は*結合*として記述されていません。しかし、あなたの問題は何ですか?あなたはなぜジョインについて「不快に感じますか? 1つのSQLステートメントで複数のテーブルを照会したい場合は、分割します。 –