2016-12-13 68 views
0

我有一個MySQL查詢,我認爲它會拋出一個異常,但它沒有。只是想弄清楚爲什麼?查詢是:帶子查詢的IN子句按預期工作

select count(distinct uid) 
from nov_visit_20161201 
where pv_listen>0 
and uid in (select distinct uid from nov_visit_20161120 where pv_listen>0); 

問題是表nov_visit_20161120沒有pv_listen列,但查詢行之有效。當我獨自運行子查詢:

select distinct uid from nov_visit_20161120 where pv_listen>0 

我得到這個:「未知列‘where子句’pv_listen'」。

任何人都可以告訴我爲什麼?

+0

您的外部查詢引用另一個表,內部引用另一個表,內部引用的表沒有該列。這就是爲什麼一個人工作,一個人不工作 –

+2

如果該表沒有列出您引用的列,並且您知道該列,那麼問題是什麼? –

+0

@Hanky Panky,我認爲應該有一個錯誤,但不是,我想知道爲什麼。@ Sumit Gupta的回答是正確的。 – madtracy

回答

0

如果列不存在於表中,剛剛從那裏條件將其刪除:

select count(distinct uid) 
from nov_visit_20161201 
where pv_listen>0 
and uid in (select distinct uid from nov_visit_20161120); 
+0

就我而言,我只需要添加表nov_visit_20161120中的pv_listen列,我只想找出原因。@ Sumit Gupta的回答是正確的。 – madtracy

1

我必須遵守同樣的事情幾次,解釋就可以了,那pv_listen子查詢引用主查詢表。

考慮一種情況,您想運行使用主查詢列中的值的子查詢,如何編寫它?您只需在子查詢中放置列的名稱,並在那裏使用數據行的列值。因此,當在子查詢表/數據集中找不到列時,它認爲該列屬於主查詢,並且在您的情況下它找到了相同的結果。因此沒有錯誤。

所以,它實際上是運行它作爲

select count(distinct uid) 
from nov_visit_20161201 
where pv_listen>0 
and uid in (select distinct uid from nov_visit_20161120); 

sub query過濾器不過濾任何記錄。

+0

感謝您的回答,我做了一些測試,我認爲您的答案是正確的。 – madtracy