Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQL中联接多个select语句_Sql_Performance_Oracle_Join_Subquery - Fatal编程技术网

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

如何在SQL中联接多个select语句,sql,performance,oracle,join,subquery,Sql,Performance,Oracle,Join,Subquery,我想知道如何在1样式和2性能方面改进此表单的查询。为了以防万一,我使用Oracle作为我的数据库。此外,此查询的目的是从第一条select语句中选择在左侧联接右侧的记录集中没有相应记录的所有记录。ColumnA中的记录在任何表中都不一定是唯一的 select ColumnA from (Select ColumnA from Table1) left join ((select ColumnA, ColumnB from Table2) union

我想知道如何在1样式和2性能方面改进此表单的查询。为了以防万一,我使用Oracle作为我的数据库。此外,此查询的目的是从第一条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;

谢谢。

我认为没有必要成立工会:

另一种选择是不在以下情况下使用:


这两种方法都应该返回表1中不在表2或表3中的任何ColumnA记录。

这里有三种选择

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;


我认为您可以将此查询重写为以下内容:


至于样式,我建议使用显式连接条件语法LEFT join。。。在table1.somecolumn=table2.someothercolumn上,而不是使用条件,以确保可读性和清晰性。但这很可能是个人偏好:-

由于左联接和空测试:是否有任何列定义为NOTNULL?是的,数据库中的任何列都不是空的。+1。我认为第二个选项更清晰,尽管它应该是select distinct ColumnA。@GordonLinoff-完全正确,忘记了group by!我在下面问了这个问题,但它在这里也适用于这个答案。就样式而言,在使用联接或子查询之间是否有偏好?就样式而言,您应该使用AND而不是第一个查询中的where子句,在使用联接或子查询之间是否有偏好?您应该在第一个查询中使用AND而不是where子句,就像这种形式,因为这正是我试图实现的逻辑。是否有任何原因导致这种形式因风格而不受欢迎?性能如何?您可能希望使用EXPLAIN PLAN来比较查询的执行计划。这里有一个最近的SO帖子:
select distinct ColumnA
from Table1 
where ColumnA not in (select ColumnA from Table2) 
    and ColumnA not in (select ColumnA from Table3);
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);
SELECT  DISTINCT ColumnA
FROM    (SELECT  ColumnA
         FROM    Table1)

MINUS

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