有人可以帮助您了解具有多个where条件的外部联接的语法吗?我不确定整体查询的语法,特别是不确定如何为所有三个表添加条件。
我有三张桌子:
A:员工(hr_empmstr)
B:福利(hr_beneinfo)
C:job(hr_emppay)
答:我需要一份所有员工的名单(A)。我需要过滤此列表以仅提供活跃的员工。
B:对于表A中的每个员工,我需要根据福利表(B)中当前有效的日期行显示当前选出的福利(即使我仍然需要一行)。我打算使用像benefit_end_dt>这样的东西。 GETDATE()。此表每个员工有多行,因此A:B为1:多。
C:我需要根据Job表(C)中当前有效的日期行显示当前职位。此表每个员工有多行,因此A:C为1:多。
以下是我到目前为止但不确定如何添加表C以及如何为所有表添加条件(活动,最新行等等)
select a.id, a.name, a.type, a.gender, a.hr_status, b.bene_plan, *
from hr_empmstr a
left outer join hr_beneinfo b
on a.id = b.id
and b.bene_end > GETDATE()
尝试提交表格的图片,但我没有足够的分数: - (
希望这能提供足够的信息。 谢谢!
答案 0 :(得分:0)
如果我有3张桌子
Table a:
id, name, type, gender, hr_status
Table b:
id, a_id, bene_plan, bene_end
Table c:
id, a_id, title
然后我可以加入他们并获得以下相关信息
select
a.*, b.bene_plan, c.job_title
from
a
left outer join
b on b.a_id = a.id and b.bene_end > GETDATE()
left outer join
c on c.a_id = a.id
请注意b.bene_end
上的条件也可以在where
条款中。
select
a.*, b.bene_plan, c.job_title
from
a
left outer join
b on b.a_id = a.id
left outer join
c on c.a_id = a.id
where
b.bene_and > GETDATE() and
a.hr_status = 'A'
<强>更新强>
如果您仍然希望在没有匹配的b
记录时看到来自a
的条目,您可以考虑执行full join
答案 1 :(得分:0)
你走在正确的轨道上。
select a.id, a.name, a.type, a.gender, a.hr_status, b.bene_plan, *
from hr_empmstr a
left outer join hr_beneinfo b
on a.id = b.id
left outer join hr_emppay c
on a.id = c.id
where b.bene_end > GETDATE() and c.job > GETDATE()
假设您在某个地方有一个活跃的员工标志,例如hr_status,在您的where语句中添加AND a.hr_status ='您的活动标志是什么' 这应该带来两个表中的所有内容。
答案 2 :(得分:0)
我们没有你的bd结构,所以如果我们假设:
1:对于每条A记录,只有一条b记录的bene_end大于GetDate()
2:表c中有一个字段“IsCurrent”
然后以下查询将起作用:
SELECT *
FROM hr_empmstr
LEFT JOIN hr_beneinfo ON hr_empmstr.id = hr_beneinfo.id
AND hr_beneinfo.bene_end > GETDATE()
LEFT JOIN hr_emppay ON hr_empmstr.id = hr_emppay.id
--AND hr_emppay.IsCurrent = 1
WHERE hr_empmstr.hr_status = 'A'
如果假设为假,那么您可以使用连接中的子查询将一对多关系减少到1:1。 这样就可以了:
SELECT *
FROM hr_empmstr
LEFT JOIN hr_beneinfo ON hr_empmstr.id = hr_beneinfo.id
AND hr_beneinfo.unique_key = (SELECT TOP 1 B.unique_key
FROM hr_beneinfo AS B
WHERE B.id = hr_empmstr.id
ORDER BY bene_end DESC)
LEFT JOIN hr_emppay ON hr_empmstr.id = hr_emppay.id
AND hr_emppay.unique_key = (SELECT TOP 1 C.unique_key
FROM hr_emppay AS C
WHERE C.id = hr_empmstr.id
ORDER BY DateFieldToReachLatest DESC)
WHERE hr_empmstr.hr_status = 'A'
另一种解决方案是在QUERY上使用CROSSJOIN,将记录减少到1:1。
我无法发表评论(还不够):
要向我们展示您的数据库结构,您可以在SQL Management Studio中右键单击您的表,然后单击“脚本为” - &gt; “创建到”。然后在您的问题中复制粘贴生成的脚本。