何为 EAV 编写选择查询 - 实体属性值模型

Usm*_*ooq 1 sql t-sql sql-server entity-attribute-value

我有以下架构。其中

  • Types 表示数据库表
  • TypeProperty 代表表格的列
  • TypeRow 代表表格行

我想编写一个选择查询,我将向Type它传递单个查询,它应该给我所有的TypePropertyTypeRow以及TypeValue与这些PropertiesRows相关联的。

我将在一个 Web 应用程序中显示这些数据,用户将从下拉列表中选择一个类型,应用程序将获得PropertiesRows和相关,并将它们显示为一个完整的网格。

我正在使用 SQL Server 2014。

有人可以帮我吗?

在此处输入图片说明

小智 5

因此,我将尝试了解您在 Kannan 方面获得的帮助。听起来您对数据库有两种不同的查询:1)下拉列表的“类型(s)”列表的查询结果,(您应该能够很容易地做到这一点)2)“类型”列表的查询结果与下拉列表中选定的“类型”相匹配的“属性”、“行”和“值”作为表格,将属性作为设置表格的标题。

对我来说,处理这个问题的最简单和最好的方法是使用 Kannan 的脚本(可能在存储过程中,也可能在视图中?)并在后端应用程序或前端的代码中创建网格最终客户。但是,如果您不能,这里有一个应该可以工作或至少可以帮助您入门的脚本。

我建议可能创建两个存储过程,一个用于检索数据,另一个用于使用动态 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
Run Code Online (Sandbox Code Playgroud)