2012-02-09 10 views
7

明らかに誰もがサブ・セレクションを嫌うので、私はジョインを使ってこれを行いたいと思います。Oracle SQL - ジョインを使用して別のテーブルではなく1つのテーブル内の値を見つける

信じられないほど複雑な例では、1〜6の数字のリストと0〜8の偶数のリストを持つ2つのテーブルを取る。それでは、私の目標はテーブルNumにすべての奇数を出力することです。私はちょうど、私がやるだろうNUMSにあっても番号のリストを取得したい場合は

Table Nums 
Number 
One 
Two 
Three 
Four 
Five 
Six 

Table Even 
Number 
Zero 
Two 
Four 
Six 
Eight 

...

select nums.number 
FROM nums, 
    even, 
where nums.number = even.number; 

しかし、どのように私はのリストを取得するためにこれらのテーブルを使用することができますテーブルの数字で非evensですか?良い十分な理由の私見ではありませんだけで、「誰かが何かを好きではない」...適切に使用する場合や、...つまり、何かのように

select nums.number 
from nums 
where nums.number not in (select number from even); 

答えて

12

副問い合わせは大丈夫です。

いくつかのオプションがあります - 例としてちょうど2:Oracleの

SELECT nums.number FROM nums 
LEFT OUTER JOIN even ON even.number = nums.number 
WHERE even.number IS NULL 

OR

SELECT nums.number FROM nums 
MINUS 
SELECT even.number FROM even 
+1

@Jeremy SQL Serverでこれを行う必要がある場合は、MINUS for Oracleと同じEXCEPTを使用します。 – Yahia

3

:ANSI SQLのための

select nums.number 
    FROM nums, 
     even 
where nums.number = even.number(+) 
    and even.number is null; 

SELECT nums.number 
    FROM nums LEFT OUTER JOIN even ON nums.number = even.number 
WHERE even.number IS NULL; 
+0

Oracle構文をありがとう。私はまだ他の構文を読む方法を知らない。 – Jeremy

+1

ansi SQLはOracle上でも動作しますが、他のDBでも動作します。 DBを変更してもSQLは動作しますが、Oracle固有のSQL文を使用する場合は、DBを変更しながらコードを確認する必要があります。 – dursun

関連する問題