您可能会编写一个通过在属性表中游标来构建动态 SQL 字符串的过程。这是在不对属性名称进行硬编码的情况下执行此操作的唯一方法。
如果您不介意对属性名称进行硬编码,有两种方法可以解决
简单子查询:(稍微容易阅读和理解)
SELECT
o.name,
(SELECT value FROM Value v JOIN Attribute a ON v.att_id = a.att_id WHERE a.name = 'Attribute1' and v.obj_id = o.obj_id) [Attribute1],
(SELECT value FROM Value v JOIN Attribute a ON v.att_id = a.att_id WHERE a.name = 'Attribute2' and v.obj_id = o.obj_id) [Attribute2]
--etc...
FROM
[Object] o;
或者使用 PIVOT:(可能快一点)
WITH CTE AS (
SELECT
o.name ObjectName,
a.name AttributeName,
v.value AttributeValue
FROM
[Object] o
JOIN Value v ON v.obj_id = o.obj_id
JOIN Attribute a ON a.att_id = v.att_id
)
SELECT
ObjectName,
[Attribute1],
[Attribute2]
--etc
FROM
CTE
PIVOT
(
MAX(AttributeValue)
FOR AttributeName IN ([Attribute1],[Attribute2])
) as Results;
在这些示例中,“Attribute1”和“Attribute2”是属性表中名称列中的属性名称。
如果您确实想构建一个动态查询来处理任意属性(如果您不能硬编码),那么您仍然会使用其中一种方法作为该动态查询的模板。在这种情况下,使用 PIVOT 方法会简单得多。