2

これは実際の例ではなく、しばらくの間私を悩ませてきたものであり、この動作を説明できる人に非常に感謝しています.

私はこれらの2つのテーブルを持っています

MYTABLE1
ID  TYPE    NAME 
1   1       typea
2   2       typea
3   3       typea
4   4       typeb
5   5       typeb
6   6       typeb
7   7       typec
8   8       typec
9   9       typec
10  10      typed

MYTYPE
ID  NAME    DESCRIPTION
1   typea   typea with desc
2   typea   
3   typea   TYPE
4   typeb   typeb with desc
5   typeb   
6   typeb   TYPE
7   typec   typec with desc
8   typec   
9   typec   TYPE

両方のテーブル (mytable1 a、mytype b) から行を返す sql が必要です。

a) MYTABLE1.type = MYTYPE.ID および MYTYPE.description='TYPE'

b) MYTABLE1.type が MYTYPE.id にない

a.id    a.type  a.name  b.id    b.name  b.description
3       3       typea   3       typea   TYPE
6       6       typeb   6       typeb   TYPE
9       9       typec   9       typec   TYPE
10      10      typed   null    null    null

私はこのステートメントを試しましたが、成功しませんでした。ユニオンやネストされた選択ではなく、外部結合を使用するソリューションが必要です。

例として、私はOracleの外部結合構文を使用していますが、標準構文を使用して条件をa) ON句内またはb) where句内に置くことで同じ結果が得られると思います

私が望むのは、それらの「奇妙な」動作を理解し、提供された例で機能するものを見つけようとすることです。私にとって最も奇妙なのはSQL2です。質問を短くするために、クエリの結果を書いていませんが、必要に応じて提供できます。

SQL1

select * 
from 
  mytable1 a,
  mytype b
where
  a.type=b.id(+)
  and b.description ='TYPE'
order by a.id

SQL2

select * 
from 
  mytable1 a,
  mytype b
where
  a.type=b.id(+)
  and b.description(+) ='TYPE'
order by a.id

SQL3

select * 
from 
  mytable1 a,
  mytype b
where
  a.type=b.id(+)
  and (b.description ='TYPE' or b.description is null)
order by a.id

前もって感謝します、

4

1 に答える 1

4

古いデカルト積構文の使用を停止します。 JOIN構文は ANSI-92 標準です。安定していると見なされるには20年で十分なはずです...

SELECT
  *
FROM
  myTable1    a
LEFT JOIN
  myType      b
    ON b.id = a.type
WHERE
     b.description = 'TYPE'
  OR b.id IS NULL

注:私は持ってb.description IS NULLいましたが、思い出す限り、ORACLE は長さ 0 の文字列を NULL として扱います。したがって、 No Joinidの場合についてフィールドをテストすることをお勧めします。

于 2012-05-24T16:59:43.870 に答える