我正在开发一个数据库结构,我有三个表
ObjectType
存储像Customer这样的实体,ObjectProperty
存储实体属性,例如Name
,Age
和ObjectData
存储Name Asif
等属性的值},Age 28
我创建了这样的表:
数据如下所示:
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表中添加新属性。
我是否需要修改数据库结构?
请建议
感谢。
答案 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