我想知道如何在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;
谢谢。
答案 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);