Ho 为 EAV 编写 Select 查询 - 实体属性值模型
Ho to write Select query for EAV - Entity Attribute Value model
我有以下架构。其中
Types
代表数据库Table
TypeProperty
表示Table 的列
TypeRow
表示table 行
我想编写一个 select 查询,我将向其传递单个 Type
,它应该给我所有的 TypeProperty
、TypeRow
和 TypeValue
与这些 Properties 和 Rows.
关联
我将在 Web 应用程序中显示此数据,用户将从下拉列表中 select 一个 Type,应用程序将获得 Properties、行和关联的值并将它们显示为完整的网格。
我正在使用 SQL Server 2014。
有人能帮帮我吗?
一个简单的连接就可以了。你在看这个吗?
Select * --your required columns
from Types t
inner join TypesProperty tp
on t.TypesId = tp.TypesId
inner join TypeRow tr
on t.TypesId = tr.TypesId
Left join TypeValue tv
on tp.TypesPropertyId = tv.TypesPrpertyId
--如果您需要值的详细信息,您需要使用 typeRowid 和 typeValue 加入
所以,我将尝试破解您在 Kannan 方面获得的帮助。
听起来您对数据库有两个不同的查询:
1) 下拉列表'Type(s)'的查询结果,(你应该可以很容易地做到这一点)
2) 'Propert(ies)', 'Row(s)', 和下拉列表中与所选 'Type' 匹配的值列表的查询结果作为 table 属性为header 设置 table.
对我来说,处理这个问题的最简单和最好的方法似乎是使用 Kannan 的脚本取回数据(可能在存储过程中,也可能是视图中?)并从您的代码中创建网格 back-end 应用程序,或前端客户端。但是,如果您不能,这里有一个脚本应该可以工作,或者至少可以让您入门。
我建议创建两个存储过程,一个用于检索数据,另一个用于使用动态 sql 进行数据透视。
CREATE PROCEDURE dbo.EAV_GridGenerator
@TypeId int = 0,
@param2 int
AS
BEGIN TRY
DECLARE @cols varchar(max),
@query varchar(max);
--TODO: CLEAN UP VARIABLE NAMES THROUGHOUT
SELECT trow.TypesId, tprop.PropertyName AS [Column], trow.TypeRowId AS [RowID], tval.Value AS [Data]
INTO #TT2
FROM dbo.[Types] AS t
JOIN dbo.TypeRow trow
ON t.typesId = trow.typesId
JOIN dbo.TypeValue tval
ON tval.TypeRowsId = trow.TypeRowId
JOIN dbo.[TypeProperty] tprop
ON tval.TypesPropertyId = tprop.TypePropertyId
WHERE trow.TypesId = @TypeId
--AND t.IsActive = 1 AND tprop.IsActive = 1 AND trow.IsActive = 1 AND tval.IsActive = 1--TODO: IDK but you should probably add both of these
-- AND t.IsDelete = 1 AND tprop.IsDelete = 1 AND trow.IsDelete = 1 AND tval.IsDelete = 1--TODO: IDK but you should probably add both of these
ORDER BY RowID, [Column], Data
SELECT @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
'],[' + t.[Column]
FROM #TT2 AS t
--ORDER BY '],[' + t.ID
FOR XML PATH('')
), 1, 2, '') + ']'
SET @query = N'SELECT RowID,'+ @cols +' FROM
(SELECT tt2.RowID,tt2.[Column] , tt2.Data FROM #tt2 AS tt2) p
PIVOT (max([data]) FOR [Column] IN ( '+ @cols +'))
AS pvt;'
EXECUTE(@query)
drop table #TT2
END TRY
BEGIN CATCH
--TODO: PROPER CATCH
END CATCH
我有以下架构。其中
Types
代表数据库TableTypeProperty
表示Table 的列
TypeRow
表示table 行
我想编写一个 select 查询,我将向其传递单个 Type
,它应该给我所有的 TypeProperty
、TypeRow
和 TypeValue
与这些 Properties 和 Rows.
我将在 Web 应用程序中显示此数据,用户将从下拉列表中 select 一个 Type,应用程序将获得 Properties、行和关联的值并将它们显示为完整的网格。
我正在使用 SQL Server 2014。
有人能帮帮我吗?
一个简单的连接就可以了。你在看这个吗?
Select * --your required columns
from Types t
inner join TypesProperty tp
on t.TypesId = tp.TypesId
inner join TypeRow tr
on t.TypesId = tr.TypesId
Left join TypeValue tv
on tp.TypesPropertyId = tv.TypesPrpertyId
--如果您需要值的详细信息,您需要使用 typeRowid 和 typeValue 加入
所以,我将尝试破解您在 Kannan 方面获得的帮助。 听起来您对数据库有两个不同的查询: 1) 下拉列表'Type(s)'的查询结果,(你应该可以很容易地做到这一点) 2) 'Propert(ies)', 'Row(s)', 和下拉列表中与所选 'Type' 匹配的值列表的查询结果作为 table 属性为header 设置 table.
对我来说,处理这个问题的最简单和最好的方法似乎是使用 Kannan 的脚本取回数据(可能在存储过程中,也可能是视图中?)并从您的代码中创建网格 back-end 应用程序,或前端客户端。但是,如果您不能,这里有一个脚本应该可以工作,或者至少可以让您入门。
我建议创建两个存储过程,一个用于检索数据,另一个用于使用动态 sql 进行数据透视。
CREATE PROCEDURE dbo.EAV_GridGenerator
@TypeId int = 0,
@param2 int
AS
BEGIN TRY
DECLARE @cols varchar(max),
@query varchar(max);
--TODO: CLEAN UP VARIABLE NAMES THROUGHOUT
SELECT trow.TypesId, tprop.PropertyName AS [Column], trow.TypeRowId AS [RowID], tval.Value AS [Data]
INTO #TT2
FROM dbo.[Types] AS t
JOIN dbo.TypeRow trow
ON t.typesId = trow.typesId
JOIN dbo.TypeValue tval
ON tval.TypeRowsId = trow.TypeRowId
JOIN dbo.[TypeProperty] tprop
ON tval.TypesPropertyId = tprop.TypePropertyId
WHERE trow.TypesId = @TypeId
--AND t.IsActive = 1 AND tprop.IsActive = 1 AND trow.IsActive = 1 AND tval.IsActive = 1--TODO: IDK but you should probably add both of these
-- AND t.IsDelete = 1 AND tprop.IsDelete = 1 AND trow.IsDelete = 1 AND tval.IsDelete = 1--TODO: IDK but you should probably add both of these
ORDER BY RowID, [Column], Data
SELECT @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
'],[' + t.[Column]
FROM #TT2 AS t
--ORDER BY '],[' + t.ID
FOR XML PATH('')
), 1, 2, '') + ']'
SET @query = N'SELECT RowID,'+ @cols +' FROM
(SELECT tt2.RowID,tt2.[Column] , tt2.Data FROM #tt2 AS tt2) p
PIVOT (max([data]) FOR [Column] IN ( '+ @cols +'))
AS pvt;'
EXECUTE(@query)
drop table #TT2
END TRY
BEGIN CATCH
--TODO: PROPER CATCH
END CATCH