我想提取一个来自“土地”的村庄的通讯送货地址。不包括“人”中已知居民的表格。有电子邮件地址email
或已经死亡的表(class
=' D')。所有地址都是已知但不是所有居民。我试过了:
$delQuery=
SELECT streetNum, streetName
FROM land
LEFT JOIN person ON land.personID=person.personID
WHERE (
email=''
OR email IS NULL
) AND class<>'D'.
输出排除class
为空的所有地址,即未上市居民的地址。如果我创建了最后一个条件:AND(类&lt;&gt;&#39; D&#39; OR类IS NULL),查询工作正常。 class
的默认值为NULL。似乎班级&lt;&gt;&#39; D&#39;意味着类不为null的另一个条件。为什么呢?
答案 0 :(得分:0)
根据我的评论要求澄清......失败是由于您尝试使用左连接,但随后添加明确查找值的WHERE子句。通过不测试NULL将其转回INNER JOIN。
将您的符合条件的条件直接置于加入级别以限制您执行/不希望的操作是完全合法的。修改了原始查询以保留左连接条件。我只是改用别名&#34; L&#34;和&#34; P&#34;为了提高可读性,并且这是一个很好的习惯,所以请求帮助,没有人需要猜测哪些列与哪些表源相关联。限定所有列。
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)。从那以后,只包括那些没有电子邮件并且没有或没有死亡的人&#39; D&#39;这个班的旗帜。
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' ))