0

WHERE 句の 1 つにサブクエリを持つ 5 つの SELECT (UNION-ed) で既存のビューを拡張しています。

そのサブクエリで使用されるテーブルは、すべての SELECT ステートメントでアクセスする必要があるため、代わりに JOIN したいと思います (ここで少し調査した後:))。

現在の形はこんな感じ(簡略化)

SELECT DISTINCT 
    ...
FROM 
    PERSON ,
    ADDRESS ,
    OWNER ,
    OBJECT
WHERE 
    PERSON.PERSONID = ADDRESS.PERSONID
    AND PERSON.PERSONID = OWNER.PERSONID (+)
    AND OWNER.OBJECTID = OBJECT.OBJECTID
    AND
    (
       OBJECT.REG_REQUIRED NOT in
       (
          'Y'
       )
       OR
       (
          OBJECT.REG_REQUIRED in ('Y')
          AND OWNER.PERSONID || OWNER.OBJECTID IN
          (
             SELECT
             REG.PERSONID || REG.OBJECTID
             FROM REGISTRATIONS REG
             WHERE APPROVED IN ('Y','V')
          )
       )
    )

結合では、サブクエリに連結があるという事実を考慮する必要があります。

SELECT DISTINCT 
    ...
FROM 
    PERSON ,
    ADDRESS ,
    OWNER ,
    OBJECT ,
    REGISTRATIONS REG
WHERE 
    PERSON.PERSONID = ADDRESS.PERSONID
    AND PERSON.PERSONID = OWNER.PERSONID (+)
    AND OWNER.OBJECTID = OBJECT.OBJECTID
    AND 
    (
       OBJECT.REG_REQUIRED NOT in
       (
          'Y'
       )
       OR
       (
          OBJECT.REG_REQUIRED in ('Y')
          AND (( OWNER.PERSONID || OWNER.OBJECTID = REG.PERSONID || REG.OBJECTID ) AND REG.APPROVED IN ('Y','V'))
       )
    )

私はこれを正しく行っていますか?

4

1 に答える 1

0

さらに調査した結果、結合は次のようにサブクエリの残りの条件とは分離できる/分離する必要があると思います。

SELECT DISTINCT 
    ...
FROM 
    PERSON ,
    ADDRESS ,
    OWNER ,
    OBJECT ,
    REGISTRATIONS REG
WHERE 
    PERSON.PERSONID = ADDRESS.PERSONID
    AND PERSON.PERSONID = OWNER.PERSONID (+)
    AND OWNER.OBJECTID = OBJECT.OBJECTID
    AND OWNER.OBJECTID = OBJECT.OBJECTID
    AND OWNER.PERSONID || OWNER.OBJECTID = REG.PERSONID (+) || REG.OBJECTID (+)
    AND
    (
       OBJECT.REG_REQUIRED NOT in
       (
          'Y'
       )
       OR
       (
          REG.APPROVED IN ('Y','V'))
       )
    )
于 2013-10-23T08:33:12.423 に答える