SQL连接与多个表的条件

时间:2015-03-04 18:55:37

标签: sql join syntax max criteria

有人可以帮助您了解具有多个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()

尝试提交表格的图片,但我没有足够的分数: - (

希望这能提供足够的信息。 谢谢!

3 个答案:

答案 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; “创建到”。然后在您的问题中复制粘贴生成的脚本。