内部使用SQL中的动态列连接3个表

时间:2017-01-04 11:59:05

标签: sql sql-server sql-server-2008

我有三张桌子

  • EmployeeConfig
  • ComboValues
  • EmployeeDetail

EmployeeConfig包含:

ID  CompanyId  FieldName    Label
---------------------------------------
9   1          DEPARTMENT   DEPARTMENT  
10  1          PTLOCATION   Prof.Tax Location
11  1          DESIGNATION  Designation 

Combovalues包含:

ID   CompanyId  FieldName   ComboValue
--------------------------------------------
11         1    DEPARTMENT  Management
12         1    DEPARTMENT  Outsource
13         1    DEPARTMENT  Trims
14         1    DEPARTMENT  Logistics
55         1    DESIGNATION Deputy Executive Director
56         1    DESIGNATION Manager
57         1    DESIGNATION Sr Manager - Trims
58         1    DESIGNATION Manager - Exports
59         1    DESIGNATION Planning Manager

EmployeeDetail包含:

ID   CompanyId  Code    Name Category Department Designation
-------------------------------------------------------------
1          1    AI001   ABC        1    11      55
2          1    S 003   MNO        1    12      56
3          1    S 022   PQR        1    13      57
4          1    S 030   XYZ        1    14      58
  • EmployeeConfig包含所有动态列
  • ComboValues包含基于EmployeeConfig
  • 的所有值
  • EmployeeDetail包含ComboValues table
  • 的ID

EmployeeDetail包含基于EmployeeConfig的动态列。我想在ComboValues表中用EmployeeDetail替换动态列值。

我尝试了这个查询:

SELECT 
    E.Id, E.NAME,
    C.ComboValue AS Designation,
    Cdep.ComboValue AS department
FROM   
    [Aquara7bc772839].EmployeeDetail AS E
FULL JOIN 
    ComboValues C ON E.Designation = C.Id
FULL JOIN 
    ComboValues Cdep ON E.Department = Cdep.Id
INNER JOIN 
    EmployeeConfig Ex ON E.CompanyId = Ex.CompanyId
WHERE  
    E.CompanyId = 1 

但是上面的查询没有返回下面的预期输出:

ID   CompanyId  Code    Name Category   Department      Designation 
-------------------------------------------------------------------------
1          1    AI001   ABC     1       Management      Deputy Executive Director
2          1    S 003   MNO     1       Outsource       Manager
3          1    S 022   PQR     1       Trims           Sr Manager - Trims
4          1    S 030   XYZ     1       Logistics       Manager - Exports

1 个答案:

答案 0 :(得分:5)

你可以像这样进行双重连接:

select e.id,
    e.companyid,
    e.code,
    e.name,
    e.category,
    c1.combovalue department,
    c2.combovalue designation
from EmployeeDetail e
left join Combovalues c1
on e.department = c1.id
and c1.fieldname = 'DEPARTMENT'
left join Combovalues c2
on e.designation = c2.id
and c2.fieldname = 'DESIGNATION';

您可以根据您拥有的其他关系(例如公司ID等)包含其他加入条款。