无法在多个表之间进行所需的JOINS

时间:2016-08-31 19:01:27

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

我有3张桌子

安排:

-hash

PlanEmp:

 plan_id   emp_id   duration
  123       1010    30
  456       1011    40
  789       1012    60

的Emp:

plan_id emp_id
 123    2131
 456    3131
 789    4131

所需摘要输出:

emp_id  Name
1010    Andy
1011    Cole
1012    John
2131    Sam
3131    Kim
4131    Ray

查询我是否尝试修改以获得上述结果:

plan_id   Name   duration
 123      Andy   30
 123      Sam    30
 456      Cole   40
 456      Kim    40
 789      John   60
 789      Ray    60

我无法确定如何使用PlanEmp表和计划表来获取员工详细信息以获取摘要输出。

4 个答案:

答案 0 :(得分:3)

这应该有效:

 <div class="grid-item car">
    <a class="fancybox fancybox-image fancybox-thumbs" rel="gallery1" href="https://s3-us-west-2.amazonaws.com/s.cdpn.io/82/drizzle.jpg" /><img src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/82/drizzle.jpg" alt="" /></a>
  </div>

<div class="hidden">
    <a class="fancybox fancybox-image fancybox-thumbs" rel="gallery1"  href="https://s3-us-west-2.amazonaws.com/s.cdpn.io/82/one-world-trade.jpg" /><img src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/82/one-world-trade.jpg" alt="" /></a>
  </div>

在这里测试:http://sqlfiddle.com/#!9/21ca79/4

答案 1 :(得分:2)

使用以下脚本。

  ;With cte_1
  As( select plan_id,emp_id
         From plan
        UNION 
         Select plan_id,emp_id
          From plan_emp)

     Select c.plan_id,e.Name,p.Duration
      From cte_1 c
         Join plan p on c.plan_id=p.plan_id
          Join emp e on c. Emp_id=e.emp_id

答案 2 :(得分:0)

我确定这是一个合乎逻辑的解释,因为我的声誉尚未达到评论水平,但emp_id为何Plan and PlanEmp tables?如果您可以对此进行规范化处理,那么最好将emp_idPlan table移至PlanEmp table

答案 3 :(得分:0)

您的表格设计未遵循所需的规范化实践。您应该合并表Plan和EmpPlan。

您的设计应该是(要标准化更多):

Table: Plan
Plan_ID
Duration

Table: PlanEmp
Plan_ID
Emp_ID

您可以通过多种方式查询现有结构,但效率可能不高。另一种方式:

Select ISNULL(P.plan_id, PE.plan_id) Plan_ID, E.Name,
(Select Duration from @Plan pp Where pp.plan_id = ISNULL(P.plan_id, PE.plan_id)) as Duration
from Emp E
left Join @lan P on E.emp_id = P.emp_id
left Join PlanEmp PE on E.emp_id = PE.emp_id
Where P.emp_id IS NOT NULL or PE.emp_id is not null