如何在SQL中连接多个select语句

时间:2013-03-22 23:05:37

标签: sql performance oracle join subquery

我想知道如何在1)样式和2)性能方面改进对此表单的查询。如果重要,我使用Oracle作为我的数据库。此外,此查询的目的是从第一个select语句中选择在LEFT JOIN右侧的记录集中没有相应记录的所有记录。 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;

谢谢。

3 个答案:

答案 0 :(得分: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条件,以提高可读性和清晰度。但这可能是个人偏好: - )

答案 1 :(得分:2)

我认为不需要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);

这两个都应该返回Table1中不在Table2或Table3中的任何ColumnA记录。

答案 2 :(得分:2)

以下是三种选择。

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);