Sql server 2008 sqlserver2008中的表设计

Sql server 2008 sqlserver2008中的表设计,sql-server-2008,database-design,Sql Server 2008,Database Design,请你对以下奇怪而复杂的设计作些评论好吗。我想继续这个设计。这是一个现有的设计,不是我创造的 员工 EmpID ----- 1 2 AttributeID Name Visible ------------------------ 1 Name 1 2 Age 1 3 Salary 1 EmpID AttributeID Value ----------------------- 1 1

请你对以下奇怪而复杂的设计作些评论好吗。我想继续这个设计。这是一个现有的设计,不是我创造的

员工

EmpID
-----
  1
  2 
AttributeID Name Visible
------------------------
  1        Name    1
  2        Age     1
  3        Salary  1
EmpID AttributeID Value
-----------------------
 1       1        Rauf
 1       2        23
 1       3        100000 
 2       1        Amal
 2       3        50000
属性

EmpID
-----
  1
  2 
AttributeID Name Visible
------------------------
  1        Name    1
  2        Age     1
  3        Salary  1
EmpID AttributeID Value
-----------------------
 1       1        Rauf
 1       2        23
 1       3        100000 
 2       1        Amal
 2       3        50000
员工属性

EmpID
-----
  1
  2 
AttributeID Name Visible
------------------------
  1        Name    1
  2        Age     1
  3        Salary  1
EmpID AttributeID Value
-----------------------
 1       1        Rauf
 1       2        23
 1       3        100000 
 2       1        Amal
 2       3        50000
我想选择上面的表格,如下所示

EmpID   Name  Age  Salary 
-------------------------
  1     Rauf   23   100000 
  2     Amal         50000 
如何在SQL Server 2008中执行此操作?

这是一个问题。要获得所需的结果,您需要在
AttributeID
上使用
PIVOT
或如下操作
PIVOT

SELECT EmpID,
       MAX(CASE WHEN AttributeID =1 THEN Value END) AS Name,
       MAX(CASE WHEN AttributeID =2 THEN Value END) AS Age,
       MAX(CASE WHEN AttributeID =3 THEN Value END) AS Salary
FROM EmployeeAttribute
GROUP BY EmpID
EAV是灵活的,但有很多缺点(谷歌“EAV anti-pattern”了解更多信息。)

您也可以自行加入

SELECT
   T1.EmpID,
   T1.Value As [name], T2.Value As [age], T3.Value As [salary]
FROM
   EmployeeAttribute T1
   JOIN
   EmployeeAttribute T2 ON T1.EmpID= T2.EmpID
   JOIN
   EmployeeAttribute T3 ON T1.EmpID= T3.EmpID
WHERE
   T1.AttributeID =1
   AND
   T2.AttributeID =2
   AND
   T3.AttributeID =3

请使用查询表名。请参阅我的编辑。@Rauf-只需将
T
替换为
EmployeeAttribute
。所需结果不需要其他表格。
SELECT*FROM EmployeeAttributes PIVOT(AttributeID在(1,2,3)中的最大值))ORDER EmployeeID
给出错误信息。错误**靠近“1”的语法不正确**为什么?@Rauf-您需要
从EmployeeAttributes PIVOT中选择*(AttributeID的最大值为([1]、[2]、[3]))P,按EmployeeID的顺序进行操作。但是我不能像这样使用
SELECT*fromEmployeeAttributesPivot(在[Attributes]中选择[AttributeID])P
。原因:(?有3个属性,所以我需要使用3个连接。对吗?@Rauf-取决于您的索引@Rauf:3 attributes=3 tables=2JOINs@gbn@gbn我在这里用了PIVOT,但self-join也不错:)。