2009-07-28 98 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

相關問題