如何在SQL中联接多个select语句
我想知道如何在1样式和2性能方面改进此表单的查询。为了以防万一,我使用Oracle作为我的数据库。此外,此查询的目的是从第一条select语句中选择在左侧联接右侧的记录集中没有相应记录的所有记录。ColumnA中的记录在任何表中都不一定是唯一的如何在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
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);