2017-10-13 28 views
0

在我的研究中,我想通過列出所有與糖尿病共同發生的疾病,即至少有一名患有糖尿病和該疾病的病歷的患者,來查看與糖尿病相關的疾病。起初我試試這個查詢:爲什麼添加FROM子句可以解決主查詢中子查詢中WHERE條件的影響?

use [ng_data] 
select distinct [disease] 
from [dbo].[Final_View_2] 
where [encode_id] in 
(
    select [encode_id] 
    where [disease] like '%diabetes%' 
) 

其中encode_id是病人的id。但是這個查詢只返回名字中含有「糖尿病」的疾病。它看起來像子查詢中的條件影響主查詢的結果。

後來,當我嘗試此查詢:

use [ng_data] 
select distinct [disease] 
from [dbo].[Final_View_2] 
where [encode_id] in 
(
    select [encode_id] 
    from [dbo].[Final_View_2] 
    where [disease] like '%diabetes%' 
) 

它工作正常。看來在子查詢中添加from子句可以解決子查詢中where子句對主查詢的影響。有人可以解釋查詢是如何進行的,以及爲什麼會產生這樣的結果?我對主查詢對子查詢的依賴感到困惑。

回答

0

您的第一個查詢的行爲就像一個相關的子查詢,即它所引用的行來自外部查詢中的結果集。實際上只是說「是這一行的列值,如'%diabetes%'」;因此將WHERE子句放入外部查詢中也不例外。

通過添加FROM在你的子查詢,你正在創建具有在疾病列糖尿病和然後選擇那些在第一結果集是encodeid沒有參考疾病列的所有行encodeids的二級結果集。

看看每個查詢的執行計劃,看看它在做什麼