2013-01-03 51 views
2

我无法简洁地描述我需要的内容,所以编辑标题的任何帮助都会被赞赏!为每个左连接行匹配重复所有基表行

我有3个表:

  1. Jobs(具有JobID PK)
  2. JobsDetail(具有JobID FK和DepartmentsID FK)
  3. Departments(具有DepartmentsID PK)

Departments将有很少的记录(〜10)

如果我有10个部门行,我需要为每个Jobs记录重复所有10行。不在作业的JobsDetail记录中的DepartmentID将在“作业”列中显示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 

产生这些结果:

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 

这是如何实现的?

这里是从表中的一些测试数据:

JobID    SubPlantID JobIdentifier          PartFamilyID OrderDate    OrderedBy           OrderQuantity DueDate     SpecialInstructions                                                            PrintDate    PrintedBy           StartDate    StartedBy           ProducedQuantity ReprintNumber CompletedDate   Location 
-------------------- ----------- -------------------------------------------------- ------------ ----------------------- -------------------------------------------------- ------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------- -------------------------------------------------- ----------------------- -------------------------------------------------- ---------------- ------------- ----------------------- -------------------------------------------------- 
2     1   1000            1   2012-12-21 13:20:00.000 Keith            1    2012-12-28 00:00:00.000                                                                 NULL     NULL            2012-12-28 00:00:00.000 NULL            NULL    0    NULL     NULL 
3     1   2000            1   2013-01-03 00:00:00.000 Jon            10   2013-01-10 00:00:00.000 NULL                                                                NULL     NULL            NULL     NULL            NULL    0    NULL     NULL 

JobsDetailID   JobID    Operation FirstStartDate   OperationQuantity OperationStatusTypeID OperationDescription                                                           DepartmentID WorkCenterID UserName 
-------------------- -------------------- --------- ----------------------- ----------------- --------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------ ------------ -------------------------------------------------- 
1     2     10  NULL     1     2      Weld                                                               1   2   keith 
2     2     20  NULL     1     3      Punch                                                               1   1   keith 
3     2     30  NULL     1     2      Form                                                               3   5   jon 
4     2     40  NULL     1     3      Paint                                                               2   4   jon 
6     2     50  NULL     1     3      Glue                                                               2   4   jwood 
9     2     60  NULL     1     2      Eat                                                               3   5   jon 
10     3     20  NULL     10    1      Punch                                                               10   18   Jon Wrye 
11     3     30  NULL     10    0      Form                                                               15   29   Jon Wrye 
12     3     40  NULL     10    0      Weld                                                               13   24   Jon Wrye 
13     3     10  NULL     10    2      Start                                                               1   1   jwrye 
14     3     50  NULL     10    0      Finish                                                               1   2   jwrye 

DepartmentID Department 
------------ -------------------------------------------------- 
1   534 
2   533 
3   530 
4   535 
5   500 
6   450 
7   430 
8   200 
9   240 
10   232 
11   220 
12   300 
13   460 
14   320 
15   310 
+1

你可以创建一个小提琴吗?sqlfiddle.com – Woot4Moo

+0

你可以发布每个表的数据吗? – Taryn

+0

@bluefeet - 完成 – TrailJon

回答

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列表中,你会看到它的工作部门应该属于,即使没有匹配。

+0

谢谢 - 我会看看这个。 JobID是PK(身份),JobIdentifier基本上是“工作号码”。 – TrailJon

+0

完美。交叉加入是我失踪的一块。谢谢! – TrailJon

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

1

您需要划掉目录(有交叉连接),部门和职位,然后做一个左连接到你的关系表

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

+0

谢谢@先生!交叉加入是票。以前从未见过SqlFiddle。整齐的东西。 – TrailJon

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 
+0

这不会返回每个工作/部门组合的记录(作业是否具有部门的详细记录)。如果我有2个工作,并且任何一个都没有Dept 500,上述查询仅返回Dept 500的一条记录(JobIdentifier的值为NULL)。我需要部门500的2条记录。希望这是有道理的。 – TrailJon

相关问题