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

时间:2017-06-03 23:56:26

标签: sql sql-server tsql entity-attribute-value

我有以下架构。其中

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

我想写一个我将传递单Type的精选查询,它应该给我与它们相关的所有TypePropertyTypeRowTypeValue 属性

我将在Web应用程序中显示此数据,用户将从下拉列表中选择 Type ,应用程序将获取属性和相关的,并将它们显示为完整的网格。

我正在使用SQL Server 2014。

有人可以帮我吗?

enter image description here

2 个答案:

答案 0 :(得分:2)

一个简单的连接就可以了..你看这个吗?

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进行联接

答案 1 :(得分:2)

所以,我将尝试对你一直在寻求Kannan帮助的事情进行分析。 听起来你对数据库有两个不同的查询:     1)查询下拉列表中“类型”列表的结果(您应该能够相当容易地完成此操作)     2)在下拉列表中查询“属性(列表)”,“行(s)”列表和与所选“类型”匹配的“值”的结果,作为具有作为设置表的标题的属性的表

对我而言,最简单和最好的方法是使用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