0

UNION2 つの select ステートメントには存在しないが、 table には存在するレコードを検索したいと考えていますt1。これが私がやっている方法です。これを行うより良い方法はありますか?

UPDATE t1
SET    t1.col1 = 0
WHERE  NOT EXISTS (
    SELECT tab2.col2
    FROM   tab2,
           tab3
    WHERE  NOT EXISTS (SELECT *
                       FROM   tab4,
                              tab5
                       WHERE  tab2.col3 = tab4.col3
                              AND tab4.col4 = tab5.col4
                              AND tab5.col5 IN ( 'TT', 'YY' ))
           AND tab3.col2 = tab2.col2
           AND tab2.col2 NOT IN(SELECT DISTINCT col2
                                FROM   tab2_uk WITH (nolock))
           AND t1.col2 = tab3.col2
           AND tab3.date IS NULL
           AND ( Isnull(tab2.pos, 0) > 0
                  OR Isnull(tab2.op, 0) > 0
                  OR Isnull(tab2.co, '-1') <> '-1' )
    UNION
    SELECT tab6.col2
    FROM   dbo.tab6 WITH (nolock),
           dbo.tab3 WITH (nolock)
    WHERE  NOT EXISTS (SELECT *
                       FROM   tab4,
                              tab5
                       WHERE  tab6.col3 = tab4.col3
                              AND tab4.col4 = tab5.col4
                              AND tab5.col5 IN ( 'TT', 'YY' ))
           AND t1.col2 = tab3.col2
           AND tab3.col2 = tab6.col2
           AND tab6.po > 0
           AND tab3.date IS NULL)
4

1 に答える 1

3

2 つの select ステートメントの UNION に存在しないレコードを検索したい

のみが両方のサブクエリで完全な重複UNIONを削除するため、この (おそらく高価な) ステップをスキップして、個々のサブクエリをチェックするだけで済みます。とにかく、存在を確認する最速の方法になる傾向があります。NOT EXISTS(NOT) EXISTS

JOINまた、あなたの s を現代の ANSI 構文に書き直しました。それ以外の場合は、変更せずに残しました:

UPDATE t1
SET    t1.col1 = 0
WHERE  NOT EXISTS (
     SELECT tab2.col2
     FROM   tab2
     JOIN   tab3 ON tab3.col2 = tab2.col2
     WHERE  NOT EXISTS (
        SELECT *
        FROM   tab4
        JOIN   tab5 ON tab5.col4 = tab4.col4
        WHERE  tab2.col3 = tab4.col3
        AND    tab5.col5 IN ('TT', 'YY')
        )
     AND tab2.col2 NOT IN(SELECT DISTINCT col2
                          FROM   tab2_uk WITH (nolock))
     AND tab3.col2 = t1.col2
     AND tab3.date IS NULL
     AND ( Isnull(tab2.pos, 0) > 0
        OR Isnull(tab2.op, 0) > 0
        OR Isnull(tab2.co, '-1') <> '-1' )
     )
AND  NOT EXISTS (
        SELECT tab6.col2
        FROM   dbo.tab6 WITH (nolock)
        JOIN   dbo.tab3 WITH (nolock) ON tab3.col2 = tab6.col2
        WHERE  NOT EXISTS (
           SELECT *
           FROM   tab4
           JOIN   tab5 ON tab5.col4 = tab4.col4
           WHERE  tab4.col3 = tab3.col3
           AND    tab5.col5 IN ('TT', 'YY')
           )
        AND tab6.po > 0
        AND tab3.col2 = t1.col2
        AND tab3.date IS NULL
        )
于 2013-01-08T23:49:19.930 に答える