什么SQL查询或视图将显示“动态列”

我有一个数据表,我允许人们将元数据添加到该表. 我给他们一个接口,允许他们对待它,就好像他们正在将数据存储在表中添加额外的列,但我实际上是将数据存储在另一个表中. Data Table DataID DataMeta Table DataID MetaName MetaData 因此,如果他们想要一个存

我有一个数据表,我允许人们将元数据添加到该表.

我给他们一个接口,允许他们对待它,就好像他们正在将数据存储在表中添加额外的列,但我实际上是将数据存储在另一个表中.

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

关于作者: dawei

【声明】:石家庄站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

为您推荐