2

右を除く左外部結合を持つ複数のテーブルにぶつかる必要がある1つのテーブルがあります。これに対するベストプラクティスはありますか? 最初に他のすべてのテーブルを結合しますか? 他の何か?

これを処理するために頭に浮かぶ最初の考えは次のとおりですが、より効率的な方法があるかどうかを知りたいです。

select
    master_table.*
from
    master_table
left outer join
    (
        select customer_id from table_1
        union
        select customer_id from table_2
        union
        select customer_id from table_3
        union
        select customer_id from table_4
    ) bump_table
on
    master_table.customer_id = bump_table.customer_id
where
    bump_table.customer_id is null
4

2 に答える 2

2

NOTEXISTSの方がいいと思います。それは確かにクエリの意図をよりよく伝えます。

select * from master_table m
 where not exists( select 1 from table_1 where m.customer_id=table_1.customer_id)
   and not exists( select 1 from table_2 where m.customer_id=table_2.customer_id)
   and not exists( select 1 from table_3 where m.customer_id=table_3.customer_id)
   and not exists( select 1 from table_4 where m.customer_id=table_4.customer_id)
于 2012-07-02T03:14:11.330 に答える
1

基本的なフォームは確かに高速です - NOT EXISTS@dbenham が既に提供したものと同様です。

SELECT m.*
FROM   master_table m
LEFT   JOIN table_1 t1 ON t1.customer_id =  m.customer_id
LEFT   JOIN table_2 t2 ON t2.customer_id =  m.customer_id
LEFT   JOIN table_3 t3 ON t3.customer_id =  m.customer_id
LEFT   JOIN table_4 t4 ON t4.customer_id =  m.customer_id
WHERE  t1.customer_id IS NULL
AND    t2.customer_id IS NULL
AND    t3.customer_id IS NULL
AND    t4.customer_id IS NULL;
于 2012-07-02T05:35:31.987 に答える