一尘不染

哪些SQL查询或视图将显示“动态列”。

sql

我有一个数据表,并且允许人们向该表中添加元数据。

我给他们提供了一个接口,使他们可以像对待添加数据的表中添加额外的列一样对待它,但实际上我是将数据存储在另一个表中。

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中进行此操作时,我做了两个查询,第一个查询获取额外的元数据,第二个查询将它们全部结合在一起。我希望现代数据库具有替代方法来处理此问题。


阅读 154

收藏
2021-03-17

共1个答案

一尘不染

您想在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
2021-03-17