正如我的评论要求澄清...失败是由于您尝试使用左连接,但是然后添加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