我正在執行以下查詢,其中有一個針對另一個表的內部連接。
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子句,第二個查詢不應該產生相同的結果,甚至更多的結果嗎?
為什么行內會產生更多的結果呢?
如果我應該在第一個查詢中修改什么,請給予建議,謝謝。
uj5u.com熱心網友回復:
行內、左聯或交叉聯接都會有重復的記錄。sch1.otherTable.name不是唯一的,這導致了行的重復,因為對于左表的每一行,右表的所有對應行都被選中,這是正常的連接行為。
為了獲得重復的名字串列,請使用這個查詢,并決定如何洗掉重復的行:過濾或區分或按行數過濾,等等
。select count(*) cnt,
名稱
from sch1.otherTable
having count(*)>/span>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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/318977.html
標籤:
