我有一个数据表,我允许人们向该表添加元数据。
我为他们提供了一个界面,允许他们将其视为向存储数据的表添加额外的列,但实际上我将数据存储在另一个表中。
Data Table
DataID
Data
Meta Table
DataID
MetaName
MetaData
因此,如果他们想要一个存储数据、日期和名称的表,那么我将在数据表中包含数据,在元名称中包含“日期”一词,在元数据中包含日期,以及数据表中的另一行元表,元名称中包含“名称”,元数据中包含名称。
我现在需要一个查询,从这些表中获取信息,并将其呈现为来自带有两个附加列“数据”和“名称”的单个表,因此对于客户来说,看起来就像有一个带有自定义列的表:
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
To here:
MyTable
Data Date Name
Testing! 20081020 adavis
Hello, World! 20081019 mdavis
几年前,当我使用 PHP 在 MySQL 中执行此操作时,我执行了两次查询,第一个查询获取额外的元数据,第二个查询将它们连接在一起。我希望现代数据库有处理这个问题的替代方法。
与选项 3 相关这个问题.
-Adam
您想要旋转 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)