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也不错:)。