我正在尝试INNER JOIN
两个表:tbl_profile
和tbl_employment
tbl_profile
有:
id_no (pk)
lastName (String)
firstName (String)
tbl_employment
有:
company_no (pk)
id_no (fk)
datehired (date)
company (string)
end_employment (date)
profile
表中的每个人在生活中可以有很多工作或根本没有工作。但我需要找到该人的最新date_hired
。
这些是我想要设定的条件:
在确定上述条件后,我的查询将添加另一个名为STATUS
的列,该列仅根据上述条件说明EMPLOYED
或UNEMPLOYED
。
但是,当我将此逻辑转换为查询时,它会声明
语法错误:缺少运算符。
我读了一本关于使用when
- then
语句的书,例如if
- else
在查询的SELECT
中可以做到。但是根据我的查询,它不起作用。这有什么问题?
SELECT p.id_no, p.lastName ,
(CASE
WHEN c.date_hired != "" AND c.end_employment = "" THEN 'employed'
WHEN c.date_hired != "" AND c.end_employment != "" THEN 'unemployed'
WHEN c.date_hired = "" THEN 'unemployed'
END)
AS employment_status
FROM tbl_profile AS p INNER JOIN tbl_employment AS c ON p.id_no= c.id_no;
它说错误在这部分内:
(CASE
WHEN c.date_hired != "" AND c.end_employment = "" THEN 'employed'
WHEN c.date_hired != "" AND c.end_employment != "" THEN 'unemployed'
WHEN c.date_hired = "" THEN 'unemployed' END)
P.S:我在MS Access中进行了查询
答案 0 :(得分:1)
错误来自!=
,它不是MS Access中的有效比较运算符。有<>
,但虽然这有效但它不是你需要的:
您正在将日期与空字符串进行比较,这有点奇怪。我想您的日期存储在具有适当日期数据类型的列中。您应该检查值是否为null
。
此外,您的查询将找不到tbl_employment
中没有任何记录的人。你需要一个外部联接。
最后,您的查询不会阻止您为同一个人获取多个结果:您需要对结果进行分组。我建议MIN
,以便同时获得employed
和unemployed
,employed
的情况将是总体结论。
未经测试(我没有MS Access):
SELECT p.id_no,
p.lastName,
MIN(IIF(c.date_hired IS NOT NULL AND c.end_employment IS NULL,
'employed',
'unemployed'
)) AS employment_status
FROM tbl_profile AS p
LEFT JOIN tbl_employment AS c
ON p.id_no = c.id_no
GROUP BY p.id_no,
p.lastName;
另请注意CASE WHEN
表达式更改为IIF
:MS Access does not support the former。
此外,只有一个条件是“雇用”结果:所有其他条件都表示失业,因此不需要单独核实。