1

オブジェクトのテーブル、属性を定義するテーブル、およびオブジェクトの属性値を含むテーブルがあります。

OBJECTS:
ID  | ...
----+-----
1   | ...
2   | ...

ATTRIBUTES:
KEY  | DEFAULT
-----+---------
a1   | xyz
a2   | abc
a3   | 123

OBJECT_ATTRIBUTES:
OBJECT_ID  | KEY  | VALUE 
-----------+------+-------
1          | a1   | abcd
1          | a2   | xyzw
2          | a3   | 12345

したがって、各オブジェクトはその属性の値を定義できます。それ以外の場合はdefault、その属性の を使用する必要があります。

ここで、すべてのオブジェクトをすべての属性に結合し、レコードが存在しないときはdefaultいつでも置換する select が必要です。OBJECT_ATTRIBUTES

INTENDED QUERY RESULT:
OBJECT_ID  | ...  | KEY  | VALUE 
-----------+------+------+-------
1          | ...  | a1   | abcd
1          |      | a2   | xyzw
1          |      | a3   | 123 <- filled in default
2          |      | a1   | xyz <- filled in default
2          |      | a2   | abc <- filled in default
2          |      | a3   | 12345

SQLでこれを行うにはどうすればよいですか?


折りたたみの下: 今は選択するだけです

SELECT * FROM OBJECT LEFT JOIN OBJECTS_ATTRIBUTES ON ID = OBJECT_ID

ただし、空白を手動で入力する必要があります。

4

2 に答える 2

3

すべてのオブジェクトにすべての属性が含まれるように、テーブルObjectsのデカルト積を取得する必要があります。Attributes

SELECT  a.*,
        b.key,
        COALESCE(c.value, b.default) Value
FROM    Objects a
        CROSS JOIN Attributes b
        LEFT JOIN Object_Attributes c
            ON  a.ID = c.object_id AND
                b.key = c.key
ORDER   BY a.ID, b.key
于 2013-10-10T07:28:49.937 に答える
1

からすべての既存のエントリを取得し、 と からOBJECT_ATTRIBUTES(UNION ALL) 不足している組み合わせを追加できOBJECTSますATTRIBUTES

SELECT OBJECT_ID, KEY, VALUE
FROM OBJECT_ATTRIBUTES

UNION ALL

SELECT o.ID, a.KEY, a.DEFAULT
FROM OBJECTS AS o
CROSS JOIN ATTRIBUTES AS a
WHERE NOT EXISTS (
  SELECT *
  FROM OBJECT_ATTRIBUTES
  WHERE OBJECT_ID = o.ID AND KEY = a.KEY
);
于 2013-10-11T07:02:21.007 に答える