2017-05-23 61 views
0

以下是我的查詢左連接返回的行少於預期?請提供你的推理,

Select Count(*) 
     from Table1 s 
       left join Table2 d 
        ON s.subjectid = d.subjectid 
        and s.PROJECTID = d.projectid 
        and s.SITEName = d.SITENAME 
       left join Table3 dev 
        on s.subjectid = dev.subjectid 
        and s.projectid = dev.projectid 
        and s.siteid = dev.siteid 
     Where s.isprod =1 
     and d.isprod =1 
     and dev.isprod = 1 
     and s.projectid =107 
     -- Output 301 ROWS 

現在這個查詢返回給我301行,但是如果我不使用表3如下圖所示

查詢,則連接返回我的2203行,
  Select Count(*) 
     from Table1 s 
       left join Table2 d 
        ON s.subjectid = d.subjectid 
        and s.PROJECTID = d.projectid 
        and s.SITEName = d.SITENAME 
     Where s.isprod =1 
     and d.isprod =1 
     and s.projectid =107 
     -- OutPut 2203 ROWS 

根據我對左連接的理解,左表中的所有行應保留,即使它們與右表不匹配。但是在這種情況下,我的行從查詢2中的2203減少到查詢1中的301。這怎麼可能?

請提出可能會出現什麼問題。更多的澄清,

表1具有相同的「其中」條件如上述具有1300行

表2用相同的「其中」條件如上述具有2203行

表3以相同的「其中」條件如上述具有129行

回答

3

當你在你的where子句將非空約束從你有外連接的表中的記錄條件,有效地破壞外的效果加入,並使其充當內部聯接

解決的辦法是這樣的約束移動到外的on條款加入:

Select Count(*) 
    from Table1 s 
      left join Table2 d 
       ON s.subjectid = d.subjectid 
       and s.PROJECTID = d.projectid 
       and s.SITEName = d.SITENAME 
       and d.isprod =1 
      left join Table3 dev 
       on s.subjectid = dev.subjectid 
       and s.projectid = dev.projectid 
       and s.siteid = dev.siteid 
       and dev.isprod = 1 
    Where s.isprod =1 
    and s.projectid =107 
+0

這是一個非常準確的解決方案!謝謝Trincot! –

0

第一SQL有附加‘其中’的條款‘與dev.isprod = 1’。這很可能會減少返回的行數。