我有一个对象表和一个属性表,其中包含对象可能具有或不具有的各种属性。
我想获取对象的所有属性,如果没有属性,则为 null。
我第一次尝试查询是这样的:
SELECT o.Id ,
aa.Value AS AttributeA,
ab.Value AS AttributeB,
ac.Value AS AttributeC
FROM Objects o
LEFT OUTER JOIN Attributes aa
ON (o.Id = aa.ObjectId)
LEFT OUTER JOIN Attributes ab
ON (o.Id = ab.ObjectId)
LEFT OUTER JOIN Attributes ac
ON (o.Id = ac.ObjectId)
WHERE (aa.AttributeTypeId = 1 OR aa.AttributeTypeId IS NULL)
AND (ab.AttributeTypeId = 2 OR ab.AttributeTypeId IS NULL)
AND (ac.AttributeTypeId = 3 OR ac.AttributeTypeId IS NULL)
AND o.Id = @objectId
这样做的问题是,如果还没有对象具有属性 a,那么 aa 子集是空的,因此只返回根本没有属性的对象。
即使混合了属性场景,我如何才能让 SQL Server 返回所有对象而不会进入大量 UNION(属性类型的数量是 20+)?