2009-07-28 2 views
0

У меня есть поле PropertyValue в таблице UserProfile, которое может содержать информацию для адреса, номера телефона, имени, фамилии, имени пользователя, города и т. Д. ... каждая запись в этой таблице связана с пользователем 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

+0

Я не знаю, я бы попробовал это и сравнил производительность с моим решением. Я думаю, вы обнаружите, что моя работает намного лучше, если таблица большая, и у вас много полей для сборки (потому что это решение использует объединение для каждого поля). – automatic

0

Я думаю, вы могли бы сделать выбор из одной таблицы несколько раз. Пусть говорят ВУ имя таблицы с 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

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' 
... 

Обратите внимание, что это зависит от их быть некоторым ID поля в UserProfile, которые вы можете использовать для т т.е. все строки для одного и того же пользователя вместе.

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

Мне нужно было бы узнать больше о ваших школьных подписях и о том, что вы пытаетесь выполнить, но может быть, чтобы создать функцию Scalar 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 [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

+0

Согласен, но по умолчанию настроены профили пользователей (DNN на Asp.Net). Если я не пройду и не создаю таблицы для каждого, которые необходимо изменить, переустановите все модули DNN, которые используют эти таблицы, и создайте полностью новые модули регистрации и профиля, которые могут обрабатывать работу с таблицей таким образом и обрабатывать добавление новых столбцов к таблице для каждого нового свойства настраиваемого профиля ... Техника не изменится ... Я думаю, что я воспользуюсь успехом. – Matt

Смежные вопросы