-2

次のようなテーブルがあるとします。

entity_id attribute_name attribute_value
----------------------------------------
0         server         alpha
1         server         beta
0         priority       1
1         priority       2
1         comment        some comment
2         server         gamma

これらの結果が得られる PostgreSQL のクエリは次のとおりです。

server    alpha     beta
priority  1         2

ノート:

  • ID が 0 と 1 のエンティティのみを比較したいとします。
  • 属性が両方のエンティティに存在しない場合は無視できます
4

3 に答える 3

1

これを試して

CREATE TABLE test1(entity_id int,attribute_name varchar(100), attribute_value varchar(100))
insert into test1
VALUES(0,'server','alpha'),
(1,'server','beta'),
(0,'priority','1'),
(1,'priority','2'),
(2,'server','gamma')

;WITH CTE as(
select attribute_name,(select STUFF((select ','+ attribute_value from test1 where entity_id in (0,1) and attribute_name=t1.attribute_name  for XML path('')),1,1,'') ) as colms
from test1 t1
where entity_id in (0,1)
group by attribute_name)

select attribute_name,LEFT(colms,CHARINDEX(',',colms,1)-1) as attr_value1,RIGHT(colms,len(colms)-CHARINDEX(',',colms,1)) as attr_value2 from CTE
order by 1 desc
于 2012-08-13T16:42:53.770 に答える
0

少なくともMySQLで動作します:

select attr_list.attribute_name, t0.attribute_value, t1.attribute_value
  from (select distinct attribute_name from tbl) as attr_list
  left join tbl as t0 on t0.attribute_name = attr_list.attribute_name 
   and t0.entity_id = 0
  left join tbl as t1 on t1.attribute_name = attr_list.attribute_name 
   and t1.entity_id = 1
于 2012-08-13T16:27:05.353 に答える
0

これは TSQL で機能するはずです。

SELECT T.attribute_name, A.attribute_value, B.attribute_value
FROM theTable T
CROSS APPLY (
    SELECT T0.attribute_value
    FROM theTable T0
    WHERE T0.entityId = 0 AND T0.attribute_name = T.attribute_name
) A
CROSS APPLY (
    SELECT T1.attribute_value
    FROM theTable T1
    WHERE T1.entityId = 1 AND T1.attribute_name = T.attribute_name
) B

を追加CROSS APPLYして、より多くのエンティティの結果を含めることができます。すべてのエンティティ ID/名前のペアがあることが保証されていない場合はattribute_value、それを置き換えることができますOUTER APPLY(またはINNER/をLEFT JOIN同等に使用します) 。

于 2012-08-13T16:25:01.493 に答える