如何从具有文档样式DB结构的SQL Server表中获取数据

时间:2016-08-25 03:20:07

标签: sql sql-server

我正在开发一个数据库结构,我有三个表

  • 对象类型
  • OBJECTPROPERTY
  • 目标数据

ObjectType存储像Customer这样的实体,ObjectProperty存储实体属性,例如NameAgeObjectData存储Name Asif等属性的值},Age 28

我创建了这样的表:

http://prntscr.com/ca344a

数据如下所示:

ObjectId    ObjectName
----------------------
1           Customer

PropertyId     PropertyName     ObjectId
----------------------------------------
    1             Id                  1
    2             Name                1

DataId  PropertyId    Date
--------------------------
   1        1         121
   2        2         Usama
   3        1         122
   4        2         waleed

但问题是如何使用SQL获取一个实体(Customer)的名称和年龄。

[编辑]

生成表的SQL脚本:

CREATE TABLE [dbo].[ObjectData]
(
    [DataId] [int] NULL,
    [PropertyId] [int] NULL,
    [Date] [nvarchar](50) NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[ObjectProperty]
(
    [PropertyId] [int] NULL,
    [PropertyName] [nvarchar](50) NOT NULL,
    [ObjectId] [int] NOT NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[ObjectType]
(
    [ObjectId] [int] NULL,
    [ObjectName] [nvarchar](50) NULL
) ON [PRIMARY]

要求用户可以随时向objectproperty表添加属性。所以它就像动态实体模型。 (像这样的编辑prntscr.com/ca3hou)

期望的输出:

PropertyId  DataId   Date
----------------------------
1             1      121
2             2      Usama

请注意,可以随时在objectproperty表中添加新属性。

我是否需要修改数据库结构?

请建议

感谢。

2 个答案:

答案 0 :(得分:0)

试一试:请准确考虑表格和列名称

SELECT ot.ObjectName, op.PropertyName, od.data
FROM ObjectType ot
INNER JOIN OBJECTPROPERTY OP ON op.ObjectId = ot.ObjectId
INNER JOIN ObjectData OD ON od.PropertyId = op.PropertyId

关于确切的结构请分享您的全部要求然后我们可以建议。

答案 1 :(得分:0)

使用以下脚本。

      WITH cte_date
       AS( SELECT d.DataId,d.PropertyId,d.[Date],ROW_NUMBER()OVER(PARTITION BY PropertyID ORDER BY PropertyID) RNO
           FROM ObjectType o
             JOIN [ObjectProperty] p ON o.ObjectId=P.ObjectId
               And o.objectName='Customer' 
                And p.PropertyName in ('Name','Id')
             JOIN objectData d On p.Propertyid= d.propertyId)
    SELECT DataId,PropertyId,[Date]
    FROM cte_date
    WHERE RNO=1