我正在执行以下查询,该查询对另一个表具有内部连接。
select count(myTable.name)
from sch2.sample_detail as myTable
inner join sch1.otherTable as otherTable on myTable.name = otherTable.name
where otherTable.is_valid = 1
and myTable.name IS NOT NULL;
这会产生一个4912304的计数。
下面是对单个表(我的表)的查询。
SELECT COUNT(myTable.name)
from sch2.sample_detail as myTable
where myTable.name IS NOT NULL;
这将产生一个2864654的计数。
但是这怎么可能呢?两个查询都有where myTable.name IS NOT NULL
.
子句。第二个查询不应该产生相同的结果,如果不是甚至更多,因为第二个查询没有otherTable.is_valid = 1
子句?为什么内连接产生更高的结果计数?
第一个查询是否有需要修改的地方,请告知,谢谢。
内连接、左连接或交叉连接可以复制行。sch1.otherTable.name
不是唯一的,这会导致行重复,因为左表中的每一行都选择了右表中的所有相应行,这是正常的连接行为。
要获得重复的名称列表,使用这个查询并决定如何删除重复的行:filter或distinct或filter by row_number等
select count(*) cnt,
name
from sch1.otherTable
having count(*)>1
order by cnt desc;
如果需要EXISTS(并且不需要从otherTable中选择列),使用left semi join
。此外,具有distinct的子查询可用于在连接和筛选之前预聚合名称:
select count(myTable.name)
from sch2.sample_detail as myTable
LEFT SEMI JOIN (select distinct name from sch1.otherTable otherTable where otherTable.is_valid = 1 ) as otherTable on myTable.name = otherTable.name
where myTable.name IS NOT NULL;