0

PropertyValue住所、電話番号、名、姓、ユーザー名、都市などの情報を含むことができるテーブルで呼び出されるフィールドがありUserProfileます...このテーブルの各レコードは、UserId によってユーザーに関連付けられています。各プロパティの定義をProfilePropertyDefinition含む に変換します (つまり、PropertyName)。

この関係により、すべてのプロパティ値とそのプロパティ名を取得できます。これらの 2 つの列 (PropertyValue、PropertyName) からデータを抽出し、次のようなテーブルを作成するためにやりたいこと:

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つの列を取り、その値を複数の異なる列に表示する方法を知っている人はいますか?

4

7 に答える 7

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

(

于 2009-07-28T20:08:26.853 に答える
1

個人的には、ここで立ち止まって、この設計がパフォーマンスにどれほど悪いかを検討します。これは、一般に、このタイプのデータを保存するために使用する非常に貧弱な手法です。表示したいプロパティが 20 個ある場合は、このテーブルに 20 回参加する必要があります (各プロパティが表示されるとは限らないため、結合はそのままにしておきます)。さらに、これがデータ構造の中心である場合 (保存しているように見えるデータのタイプからのように聞こえるため)、事実上すべてのクエリで同様のことを行う必要があり、パフォーマンスが大幅に低下します。これが最良のモデルである場合もありますが (どのプロパティを保存する必要があるかを前もって知る方法がない場合)、ほとんどの場合、これを使用することは設計が悪いことを示しています。

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

于 2009-07-28T21:54:11.693 に答える
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'
于 2009-07-28T20:08:50.737 に答える
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
于 2009-07-28T20:09:57.113 に答える
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.UserProfileID=@UserProfileID

    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]
于 2009-07-28T20:13:22.613 に答える
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 ....

理想的ではありませんが、うまくいくでしょう

于 2009-07-28T20:02:46.113 に答える
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'
...

これは、同じユーザーのすべての行を結び付けるために使用できる UserProfile の ID フィールドに依存していることに注意してください。

于 2009-07-28T20:05:22.053 に答える