2016-11-08 16 views
-2

oracle sqlの外部結合を検索してショットカットがあるかどうかを確認しました(mysqlで考えるように、外部結合を行うことができると信じています)。私は有望に見えたが動作しなかったものを見つけた。私は外部結合構文を覚えていないので、ショートカットを見つけようとしています。私はいつもそれを見なければならない。たとえば、次のようにします。oracle sqlの外部結合

SELECT 
    l.*, 
    r.* 
FROM database.login l LEFT OUTER JOIN database.relation r 
    ON l.user_id = r.user_id 
     AND r.user_id IS NULL 

r.user_idのいくつかの値は、予想通りにnullでした。

SELECT 
    l.*, 
    r.* 
FROM database.login l, database.relation r 
WHERE l.user_id = +r.user_id 

それはuser_idの一致database.loginを持っていなかったdatabase.relationから行を選択しなかった:私はどこかで読んだ試してみました。

それで、構文全体を入力する必要がありますか?私は、関係のないログインでエントリを取得しようとしています。

私は、次のようなもの使用することができたとします。あなたは次のように行うことができ、必要な

+2

最初のクエリで正確に何が間違っていますか? –

+0

私の謙虚な意見では、ANSI結合構文を学ぶ時間を取るべきです。 'select * from some_table some_other_table 'のように難しいことではありません。あなたは、使用する結合タイプを知っていなければなりません。結合条件になるのは – Boneist

答えて

0

場合

u.user_id not in select user_id from database.relation 

を:左外側ため

select l.*, r.* 
from database.login l, database.relation r 
where l.user_id = r.user_id (+) 

が参加し、

select l.*, r.* 
from database.login l, database.relation r 
where l.user_id (+) = r.user_id 
右の場合は

外部結合

+4

です。オラクルは、もはや**(+)演算子を使用しない**ことをオラクルは推奨しています。 –

+0

しかし、より短い構文で外部結合を実装する方法です。私はこれを常に使用しており、問題に遭遇したことはありません。それが慎重に使用されている場合はそれを使用することは大丈夫です。 – Nemanja91

+0

@ Nemanja91あなたは明らかに 'SELECT * FROM t1、t2、t3 WHERE t1.col1 = t2.col1(+)AND t2.col2(+)= t3.col1;'のような結合を試みていないのです。 'ORA-01417:テーブルは外側に最大で1つの他のテーブルに結合されているかもしれません。' SELECT * FROM t1 LEFT OUTER JOIN t2 ON(t1.col1 = t2.col1)RIGHT OUTER JOIN t3 ON(t2.col2 = t3.col1); 'うまく動作します! – Boneist