正如我的評論要求澄清...失敗是由於您嘗試使用左連接,但是然後添加WHERE子句明確尋找一個值。通過不測試空轉它回到一個INNER JOIN。
將您的限定條件直接放入連接級別以限制您的操作/不想操作是完全合法的。修改原始查詢以保留左連接條件。我只是改爲使用別名「L」和「P」來縮短可讀性,進入這樣尋求幫助是一個很好的習慣,沒有人需要猜測哪些列與哪些表源相關聯。限定所有列。
SELECT
L.streetNum,
L.streetName
FROM
land L
LEFT JOIN person P
ON L.personID = P.personID
AND (( P.email IS NULL OR P.email='')
AND P.class <> 'D')
因此,由於您的標準的其他部分只是在人,我將這些元素移動到左連接。因此,上述SQL的結構化方式,無論是否有人都可以獲得所有的地理位置。
如果你想要的只是那些與土地有關的記錄(需要那部分),但也有一個有效的電子郵件(非空白/空白)而沒有死亡,你將需要部分進入到哪裏,但是你需要把它保留在哪裏,但是讓我們試着真正知道被問到的是什麼。由於我仍然沒有從你的查詢中得到你想要的結果,下面的查詢將得到所有記錄,至少通過(P.PersonID IS NOT NULL)來記錄一個人的記錄。從那以後,只包括那些沒有電子郵件,並且有NULL或者不是已故的'D'標誌的班級。
SELECT
L.streetNum,
L.streetName
FROM
land L
LEFT JOIN person P
ON L.personID = P.personID
WHERE
P.PersonID IS NOT NULL
AND (
( P.email IS NULL OR P.email='')
AND P.class IS NOT NULL
AND P.class <> 'D'))
你的問題是wishy-washy。澄清,Class在PERSON表中?另外,你想要什麼。你正在尋找空電子郵件和類不'D'。由於這個班是其中的一部分,這就是殺死你的LEFT JOIN,並把它變成一個INNER JOIN。請澄清。 – DRapp 2015-02-17 23:49:33
'class'和'email'都在person表中,我認爲應該在WHERE條件中。該查詢正常工作,但只有當'class <>'D''(如上)'後面有'OR class IS NULL'時。 'class <>'D'如何排除NULL的實例? – 2015-02-18 06:00:13