我知道这是不可能直接的,但也许在sql函数的帮助下,可以创建具有动态列数的视图?我到底想要做的是 - 创建视图,其中列将是用户名(第一个表的值),日期(第二个表的值),以及属性的多个列(每个第三个表的行将是列)。用户表结构 - ID和用户名,日期表结构 - ID和日期时间,属性表结构 - ID,属性名称,属性值,fk用户ID(加上一个表关联表)。 结果应该类似于(列):
|用户名|日期| property 1 | .... | property n |
任何人都可以展示任何简单的样品吗?
答案 0 :(得分:2)
在标准SQL中,不,在我熟悉的任何SQL版本(SQL Server,Oracle,MySql,Access SQL)中也是如此。 SQL中的表,表达式和视图按设计具有固定列集。因此,它故意以这种方式受到限制。 AFAIK,在大多数SQL版本中,存储过程是唯一可以返回变量列集的对象。
答案 1 :(得分:0)
我对您的数据架构做了一些假设,但看起来您正在尝试生成类似这样的内容
CREATE VIEW User_Properties AS
SELECT
[username], [date]
,MAX(CASE WHEN [PropertyName] = 'property 1' THEN [PropertyValue] ELSE NULL END) AS [property 1]
,MAX(CASE WHEN [PropertyName] = 'property 2' THEN [PropertyValue] ELSE NULL END) AS [property 2]
,MAX(CASE WHEN [PropertyName] = 'property 3' THEN [PropertyValue] ELSE NULL END) AS [property 3]
....
,MAX(CASE WHEN [PropertyName] = 'property n' THEN [PropertyValue] ELSE NULL END) AS [property n]
GROUP BY [username], [date]
可以按照
的方式自动化--Cursor to return the list of Properties
DECLARE PROPERTY_CURSOR CURSOR FOR SELECT PropertyName From UserPropertyTable
DECLARE @PropertyName nvarchar(255)
DECLARE @SQL nvarchar(max)
--Start Building the view definition
SET @SQL ='CREATE VIEW User_Properties AS
SELECT [username], [date]'
--Add a column for each Property
OPEN PROPERTY_CURSOR
FETCH NEXT FROM PROPERTY_CURSOR INTO @PropertyName
WHILE @@FETCH_STATUS =0
BEGIN
SET @SQL = ',MAX(CASE WHEN [PropertyName] = '+QUOTENAME(@PropertyName,'''')+' THEN [PropertyValue] ELSE NULL END) AS '+QUOTENAME(@PropertyName)
FETCH NEXT FROM PROPERTY_CURSOR INTO @PropertyName
END
DEALLOCATE PROPERTY_CURSOR
--Finish off the Create_View SQL
SET @SQL =@SQL +'
FROM UserPropertyTable
GROUP BY [username], [date]'
--Execute the Create_View SQL
EXEC (@SQL)