4

このフォームのクエリを1)スタイルと2)パフォーマンスの観点からどのように改善できるか知りたいです。重要な場合は、データベースとしてOracleを使用しています。また、このクエリの目的は、LEFTJOINの右側にあるレコードのセットに対応するレコードがない最初のselectステートメントからすべてのレコードを選択することです。ColumnAのレコードは、どのテーブルでも必ずしも一意ではありません。

select ColumnA
from
    (Select ColumnA
    from Table1)
left join
    ((select ColumnA, ColumnB
    from Table2)
    union
    (select ColumnA, ColumnB
    from Table3))
using (ColumnA)
where ColumnB is null
group by ColumnA;

ありがとうございました。

4

3 に答える 3

3

このクエリを次のように書き直すことができると思います(このSQL Fiddleを参照)。

SELECT  DISTINCT ColumnA
FROM    (SELECT  ColumnA
         FROM    Table1)

MINUS

(SELECT  ColumnA
FROM    Table2
UNION
SELECT  ColumnA
FROM    Table3);

スタイルに関しては、読みやすさと明確さのためLEFT JOIN ... ON table1.somecolumn = table2.someothercolumnに、条件の代わりに明示的な結合条件構文を使用することをお勧めします。USINGしかし、これは個人的な好みかもしれません:-)

于 2013-03-22T23:36:43.840 に答える
3

UNION:の必要性はわかりません。

select T1.ColumnA
from Table1 T1
    left join Table2 T2 ON T1.ColumnA = T2.ColumnA
    left join Table3 T3 ON T1.ColumnA = T3.ColumnA
where T2.ColumnA IS NULL 
    or T3.ColumnA IS NULL
group by T1.ColumnA;

別のオプションは、以下を使用することNOT INです。

select distinct ColumnA
from Table1 
where ColumnA not in (select ColumnA from Table2) 
    and ColumnA not in (select ColumnA from Table3);

これらは両方とも、Table2またはTable3にないTable1のColumnAレコードを返す必要があります。

于 2013-03-22T23:20:54.260 に答える
2

ここに3つの選択肢があります。

select distinct ColumnA
  from Table1      a
  left join Table2 b using(ColumnA)
  left join Table3 c using(ColumnA)
 where b.ColumnB is null
   and c.ColumnB is null;

select distinct ColumnA
  from Table1 a
 where ColumnA not in(select ColumnA from Table2)
   and ColumnA not in(select ColumnA from Table3);

select distinct ColumnA
  from Table1 a
 where ColumnA not in(select ColumnA from Table2 union
                      select ColumnA from Table3);
于 2013-03-22T23:35:20.390 に答える