为每个左连接行匹配重复所有基表行

时间:2013-01-03 21:07:13

标签: sql left-join sql-server-2012

我无法简洁地描述我需要什么,所以任何编辑标题的帮助都表示赞赏!

我有3张桌子:

  1. Jobs(有JobID PK)
  2. JobsDetail(有[{1}} FK和JobID FK)
  3. DepartmentsID(有Departments PK)
  4. DepartmentsID将有少量记录(~10)

    如果我有10个部门行,我需要为每个Departments记录重复所有10行。不在作业的Jobs记录中的DepartmentID将在“作业”列中显示JobsDetail值。使用一个NULL记录,典型的Jobs按我希望的方式工作:

    LEFT JOIN

    得出这些结果:

    Select d.Department, jobs.JobIdentifier
    From    Departments d 
    LEFT JOIN (Select Distinct j.JobID, j.JobIdentifier, DepartmentID, 
               From   Jobs j
               Join   JobsDetail jd on j.JobID = jd.JobID) jobs on d.DepartmentID = jobs.DepartmentID
    

    当然,当添加另一个Jobs记录时,我会看到:

    Department  JobIdentifier
    310         NULL
    320         NULL
    430         NULL
    450         NULL
    460         NULL
    500         NULL
    530         1000
    533         1000
    534         1000
    535         NULL
    

    我需要的是这样的事情:

    Department  JobIdentifier
    310         2000
    320         NULL
    430         NULL
    450         NULL
    460         2000
    500         NULL
    530         1000
    533         1000
    534         1000
    534         2000
    535         NULL
    

    如何实现这一目标?

    以下是表格中的一些测试数据:

    Department  JobIdentifier
    310         NULL
    320         NULL
    430         NULL
    450         NULL
    460         NULL
    500         NULL
    530         1000
    533         1000
    534         1000
    535         NULL
    310         2000
    320         NULL
    430         NULL
    450         NULL
    460         2000
    500         NULL
    530         NULL
    533         NULL
    534         2000
    535         NULL
    

4 个答案:

答案 0 :(得分:4)

您应该从作业和部门之间的交叉连接开始,然后从那里构建查询:

Select d.Department, jobs.JobIdentifier
From    Departments d cross join
        (select distinct JobIdentifier from Jobs j) ji LEFT JOIN
        (Select Distinct j.JobID, j.JobIdentifier, DepartmentID, 
         From Jobs j Join
              JobsDetail jd
              on j.JobID = jd.JobID
        ) jobs
        on d.DepartmentID = jobs.DepartmentID and
           ji.jobidentifer = jobs.jobIDentifier

我对JobId和JobIdentifier之间的区别有点不清楚,所以这可能不太对。

如果将ji.JobIdentifier添加到select列表,您将看到部门属于哪个职位,即使没有匹配。

答案 1 :(得分:1)

您需要划掉目录(使用交叉连接),部门和工作,然后左键加入您的关系表

http://sqlfiddle.com/#!6/277ec/30

答案 2 :(得分:0)

这是怎么回事?

select d.Department, CASE WHEN d.DepartmentId = jj.DepartmentID THEN jj.JobID ELSE NULL END

from Department d, (SELECT j.JobID, jd.DepartmentID FROM Jobs j left outer join JobDetail jd on j.JobID = jd.JobID) as jj

答案 3 :(得分:0)

我不确定我是否理解你正在尝试做什么,所以让我们从头开始。以下陈述以何种方式证明不足?

Select 
    d.Department,
    j.JobIdentifier
From
    Departments d
    Left Join JobDetails jd On d.Id = jd.DepartmentId
    Left Join Jobs j On jd.JobId = j.Id