2009-07-28 97 views
0

我在UserProfile表中有一个名为PropertyValue的字段,其中可以包含地址,电话号码,名字,姓氏,用户名,城市等信息......此表中的每个记录都通过UserId与用户相关联,它也与一个ProfilePropertyDefinition关联,其中包含每个属性(即PropertyName)的定义。如何从SQL Server中的一个数据库字段创建多个列?

通过这种关系,我可以得到所有的属性值及其属性名称。我想怎么做才能提取这两列(的PropertyValue,属性名)的数据,并创建一个类似的表:

First Name | Last Name | Email | Phone | City | Country 
------------------------------------------------------- 
      |   |  |  |  | 

所以,我想知道我是否可以使用SQL语句来完成这一点,这是我走在它:

SELECT FirstName = (SELECT PropertyValue FROM UserProfile WHERE PropertyDefinitionID = (SELECT PropertyDefinitionID WHERE PropertyName = 'first name')), 
LastName = (SELECT PropertyValue FROM UserProfile WHERE PropertyDefinitionID = (SELECT PropertyDefinitionID WHERE PropertyName = 'last name')), 
Email = (SELECT PropertyValue FROM UserProfile WHERE PropertyDefinitionID = (SELECT PropertyDefinitionID WHERE PropertyName = 'email')) 

但是,没有工作,有些事情似乎很奇怪吧......任何人都知道如何采取一列,显示它在几个不同列中的值?

回答

1
SELECT fn.PropertyValue FirstName, 
     ln.PropertyValue LastName, 
     etc... 

From UserProfile fN 
    Join UserProfile lN 
     On fN.PropertyName = 'first name' 
     And ln.PropertyName = 'last name' 
     And fn.user = ln.user 
    Join UserProfile eM 
     On fN.PropertyName = 'first name' 
     And eM.PropertyName = 'email' 
     And eM.user = fn.user 

+1

为什么有人对此赞不绝口吗?什么使得这个答案比其他人更好?我想知道,所以我可以选择最好的答案... – Matt 2009-07-28 21:05:22

+0

我不知道,我会尝试这一点,并将性能与我的解决方案进行比较。我认为如果表格很大,并且你有很多要建立的字段(因为这个解决方案使用每个字段的联接),你会发现我的表现要好得多。 – automatic 2009-07-31 18:26:24

0

我想你可以多次从同一张表中进行选择。 咱们说的TA是名称表UserProfileID,PropertyDefinition和的PropertyValue

你可以做

select 
t1.PropertyValue as FirstName, 
t2.PropertyValue as LastName, 
... 
FROM 
tA as t1, tA as t2, .... 
WHERE 
t1.PropertyDefinition Like 'FirstName' AND 
t2.PropertyDefinition Like 'LastName' AND 
.... 
AND 
t1.UserId = @user AND 
t2.UserID = @user .... 

不理想,但它的工作

+0

你也可以构造查询作为一堆内部连接,但我认为* *在幕后操作的背后是接近相同的(不要引用我这是相同的) – Matt 2009-07-28 20:04:28

0

您需要在连接表多次(如很多时候,你有字段):

SELECT UPFN.PropertyValue AS FirstName, UPLN.PropertyValue AS LastName, ... 
FROM UserProfile UPFN 
INNER JOIN ProfilePropertyDefinition PPDFN ON PPDFN.PropertyDefinitionID = UPFN.PropertyDefinitionID AND PPDFN.PropertyName = 'first name' 
INNER JOIN UserProfile UPLN ON UPLN.id = UPFN.id 
INNER JOIN ProfilePropertyDefinition PPDLN ON PPDLN.PropertyDefinitionID = UPLN.PropertyDefinitionID AND PPDLN.PropertyName = 'last name' 
... 

请注意,这依赖于它们是在你可以用它来t为用户配置了一些ID字段即同一用户的所有行在一起。

0

UserProfile# 
{userid, 
ProfileName, 
propertyValue 
} 

假设模式你会想这样做

SELECT 
FirstName.PropertyValue FirstNAme, 
LastName.PropertyValue LastName, 
FROM 
users 
JOIN (USERPROFILE) FirstName ON 
FirstName.userid = users.userid 
and PropertName ='FirstName' 
JOIN (USERPROFILE) LastName ON 
LastName.userid = users.userid 
and PropertName ='LastName' 
0

我会写这样的查询:

Select 
    aa.userId, 
    Coalesce(Max(Case when PropertyName = 'First Name' then PropertyValue else '' end),'') as FirstName, 
    and so on 
from 
    UserTable as aa 
left join 
    UserProfile as bb 
    on 
    aa.UserId = bb.UserId 
left join 
    ProfilePropertyDefinition as cc 
    on bb.PropertyDefinitionId = cc.PropertdefinitionId 
group by 
    aa.UserId 
0

我需要更多地了解您的表格样式以及您尝试创建的内容,但是可能需要创建一个SQL标量函数来检索属性的值。我想提出的表名和数据库设置一些假设,但在尝试这个...

CREATE FUNCTION [dbo].[UserProperty] 
(
    @UserProfileID UNIQUEIDENTIFIER, @Property VARCHAR(200) 
) 
RETURNS VARCHAR(max) 
AS 
BEGIN 
    -- Declare the return variable here 
    DECLARE @Value AS VARCHAR(MAX) 
    SELECT @Value = PropertyValue FROM UserProfile up INNER JOIN PropertyDefinitions pd ON 
    up.PropertyDefinitionID = pd.PropertyDefinitionID 
    WHERE pd.PropertyName = @Property AND up.UserProfileI[email protected] 

    RETURN ISNULL(@Value,'') 

END 

SELECT 
    [dbo].[UserProperty](UserProfileID, 'first name') AS [First Name], 
    [dbo].[UserProperty](UserProfileID, 'last name') AS [Last Name], 
    [dbo].[UserProperty](UserProfileID, 'email') AS [Email] 
FROM 
    [Users] 
1

就个人而言,我会立刻停止,并考虑这样的设计会如何糟糕性能。这通常是一种很差的技术来存储这种类型的数据。如果你有20个你想要显示的资料,你将不得不加入(并且因为你不能保证每个资产都会被代表),所以你必须加入20次。此外,如果这对您的数据结构至关重要(因为它听起来像来自您似乎正在存储的数据类型),几乎每个查询都需要做类似的事情,并且性能会非常糟糕。有时候这是最好的模型(当你无法预先知道需要存储哪些属性时),但大多数情况下,它的使用是一个糟糕设计的标志。

http://en.wikipedia.org/wiki/Entity-Attribute-Value_model

相关问题