我想从'land‘表中提取一个村庄的时事通讯递送地址,不包括'person’表中电子邮件地址为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 ( class <>'D‘OR class IS NULL),查询就可以正常工作。class的默认值为NULL。似乎class<>'D‘暗示了class不为空的另一个条件。为什么?
发布于 2015-02-18 20:04:43
根据我要求澄清的评论...失败的原因是您试图使用左连接,但随后添加了WHERE子句显式查找值。通过不测试NULL,可以将其转换回内部连接。
将您的限定条件直接放在联接级别来限制您做什么/不想做什么是完全合法的。您的原始查询已修改,以保留左联接条件。我只是为了更短的可读性而改用别名"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' )因此,由于条件的其他部分只是在person中,所以我将这些元素移到了左侧-join。因此,按照上面SQL的结构方式,您将获得所有陆地位置,而不管是谁。
如果您想要的只是那些确实有一个人与土地相关联的记录(需要该部分),但也有一个有效的电子邮件(非空/空)和未去世的记录,您将需要将该部分放入where,但您将需要将其与where一起保存,但让我们尝试真正了解正在询问的内容。因为我仍然没有从您的查询中得到您想要的东西,所以下面的查询将获得至少包含一个人记录的所有记录(P.PersonID不为空)。从那以后,只包括那些没有电子邮件并且类的'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' ))https://stackoverflow.com/questions/28573262
复制相似问题