1

我必须查询一个数据库,其中对象在一个表中,这些对象的属性在第二个表中,这些属性的值在第三个表中。愚蠢,我知道。

表信息(无论如何都是基础)

OBJECT -- obj_id, name
ATTRIBUTE -- att_id, name
VALUE -- obj_id, att_id, value

我想要一个查询,其中每个对象的属性出现在我的结果顶部,并且为每个对象填充这些属性的值。起初我在想一个简单的 2 内连接查询会起作用,但这会给我每个对象的每个属性的结果,而我希望每个对象都有它自己的行。

我的第二个想法是我将不得不创建一个临时表,它基本上结合了OBJECTandATTRIBUTE表,然后是VALUEINSERT表中的信息,然后在我的新临时表上使用非常简单的查询。

想我会先在这里发布这个以获得其他想法和观点。

4

1 回答 1

1

您可能会编写一个通过在属性表中游标来构建动态 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 方法会简单得多。

于 2013-06-07T19:35:14.233 回答