我有一个数据表,我允许人们将元数据添加到该表.
我给他们一个接口,允许他们对待它,就好像他们正在将数据存储在表中添加额外的列,但我实际上是将数据存储在另一个表中.
Data Table DataID Data Meta Table DataID MetaName MetaData
因此,如果他们想要一个存储数据,日期和名称的表,那么我将拥有数据表中的数据,以及元数据中的“Date”,以及MetaData中的日期,以及元表中带有“名称”的元表和元数据中的名称.
我现在需要一个查询来获取这些表中的信息,并将其呈现为来自单个表,其中包含两个附加列“Data”和“Name”,因此对于客户来说,它看起来就像是一个包含自定义列的表:
MyTable Data Date Name
或者,换句话说,我该如何离开这里:
Data Table DataID Data 1 Testing! 2 Hello,World! Meta Table DataID MetaName MetaData 1 Date 20081020 1 Name adavis 2 Date 20081019 2 Name mdavis
到这里:
MyTable Data Date Name Testing! 20081020 adavis Hello,World! 20081019 mdavis
多年前,当我使用PHP在MysqL中执行此操作时,我做了两个查询,第一个获取额外的元数据,第二个将它们连接在一起.我希望现代数据库有替代方法来解决这个问题.
与this question的选项3相关.
-亚当
解决方法
您想要在MyTable中调整每个名称 – 值对行…试试这个sql:
DECLARE @Data TABLE ( DataID INT IDENTITY(1,1) PRIMARY KEY,Data VARCHAR(MAX) ) DECLARE @Meta TABLE ( DataID INT,MetaName VARCHAR(MAX),MetaData VARCHAR(MAX) ) INSERT INTO @Data SELECT 'Data' INSERT INTO @Meta SELECT 1,'Date',CAST(GetDate() as VARCHAR(20)) UNION SELECT 1,'Name','Joe Test' SELECT * FROM @Data SELECT * FROM @Meta SELECT D.DataID,D.Data,MAX(CASE MetaName WHEN 'Date' THEN MetaData ELSE NULL END) as Date,MAX(CASE MetaName WHEN 'Name' THEN MetaData ELSE NULL END) as Name FROM @Meta M JOIN @Data D ON M.DataID = D.DataID GROUP BY D.DataID,D.Data