2

オブジェクトのテーブルと、オブジェクトが持つ場合と持たない場合があるさまざまな属性を含む属性テーブルがあります。

オブジェクトとともにすべての属性を取得するか、属性がない場合は 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 サブセットが空であるため、属性をまったく持たないオブジェクトのみが返されることです。

多数のUNIONに入ることなく、属性シナリオが混在していても、SQL Serverがすべてのオブジェクトを返すようにするにはどうすればよいですか (属性タイプの数は20以上です)。

4

2 に答える 2

2

外部結合のターゲットをフィルタリングするときは、結合にフィルターを配置する必要があります。

すなわち:

FROM Objects o 
LEFT OUTER JOIN Attributes aa 
ON (o.Id = aa.ObjectId) and (aa.AttributeTypeId = 1)
于 2012-10-15T12:22:59.180 に答える
1

私はピボットの使用を思いつきました。属性レコードがまったくない場合でも失敗しますが、属性が 1 つだけのダミー オブジェクトを使用することで簡単に解決できます。

SELECT pvt.ObjectId, 
pvt.[1] AS [AttributeA],
pvt.[2] AS [AttributeB],
pvt.[3] AS [AttributeC]
FROM
(
    SELECT o.ObjectId, att.Value, att.AttributeTypeId 
    FROM Objects o
    LEFT OUTER JOIN Attributes att ON o.Id = att.ObjectId
    WHERE o.Id = @objectId
) attributes
PIVOT( MAX(Value) FOR AttributeTypeId 
IN ([1], [2], [3])) pvt
于 2012-10-15T12:20:38.247 に答える