我有一个名为work的表,其中包含企业中每个人的注册信息,如下所示:
表:工作
FirstName LastName SponsorshipStatus EnrollmentStatus AdjudicationStatus
--------- -------- ----------------- ---------------- ------------------
JANE DOE Complete Incomplete Incomplete
JOHN DOE Complete Complete Incomplete
MONTY PYTHON Complete Complete Complete
MARY POPPINS Complete Complete Complete
部门经理给我一份她的员工名单,如下面的员工,她需要更新状态:
表:员工
FirstName LastName
--------- --------
John Doe
Mary Poppins
Humpty Dumpty
知道两个表的情况不匹配,我尝试以下查询:
SELECT employees.FirstName, employees.LastName,
SponsorshipStatus, EnrollmentStatus, AdjudicationStatus
FROM employees LEFT JOIN work
ON (UPPER(employees.FirstName) LIKE UPPER(work.FirstName)
AND UPPER(employees.LastName) LIKE UPPER(work.LastName));
...它产生以下内容:
查询结果:
FirstName LastName SponsorshipStatus EnrollmentStatus AdjudicationStatus
--------- -------- ----------------- ---------------- ------------------
JOHN DOE NULL NULL NULL
MARY POPPINS NULL NULL NULL
HUMPTY DUMPTY NULL NULL NULL
这是我期望从查询中得到的:
FirstName LastName SponsorshipStatus EnrollmentStatus AdjudicationStatus
--------- -------- ----------------- ---------------- ------------------
JOHN DOE Complete Complete Incomplete
MARY POPPINS Complete Complete Complete
HUMPTY DUMPTY NULL NULL NULL
我在这里做错了什么?左连接正常工作,但它没有进行匹配并从工作表中提取相关数据,所有空值都证明了这一点。
我已经在这里查看了很多帖子,但这些帖子似乎都没有在这里帮助我。
答案 0 :(得分:5)
你在滥用LIKE
。除非您进行模式匹配,否则请勿使用LIKE
。改变
UPPER(employees.FirstName) LIKE UPPER(work.FirstName)
到
UPPER(employees.FirstName) = UPPER(work.FirstName)
同样使用姓氏。
答案 1 :(得分:1)
从MySQL 5.0.3开始,当您检索VARCHAR
列的值时,会包含任何尾随空格。这可能是个问题,因为在使用=
比较时,会忽略尾随空格,而考虑使用LIKE
尾随空格。
SELECT 'foo' = 'foo ';
// Returns true
SELECT 'foo' LIKE 'foo ';
// Returns false
因此,请务必使用适当的操作符。
由于列上的排序规则为CASE INSENSITIVE
,因此您不需要UPPER()
功能。事实上,删除UPPER
将允许MySQL利用列上的索引(使用列上的函数通常会否定索引的使用)。
// With case insensitive collation
SELECT 'FOO' = 'foo';
// Returns true
// LIKE will work the same
SELECT 'FOO' LIKE 'foo';
// Returns true
由于=
和LIKE
会为您返回相同的结果,但我不知道问题是什么。
您还应该为连接中的所有列指定表名,以避免出现模糊列的可能性(如果您将来要向其他表添加类似的列),并且为了便于阅读:
SELECT employees.FirstName, employees.LastName,
work.SponsorshipStatus, work.EnrollmentStatus, work.AdjudicationStatus
FROM employees
LEFT JOIN work
ON employees.FirstName = work.FirstName
AND employees.LastName = work.LastName;
但是,如果列不明确,则应该出错。