我有以下架构。其中
Types
代表数据库表TypeProperty
代表表格列TypeRow
代表表格行我想写一个我将传递单Type
的精选查询,它应该给我与它们相关的所有TypeProperty
,TypeRow
和TypeValue
属性和行。
我将在Web应用程序中显示此数据,用户将从下拉列表中选择 Type ,应用程序将获取属性,行和相关的值,并将它们显示为完整的网格。
我正在使用SQL Server 2014。
有人可以帮我吗?
答案 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