这种场景应该如何查询键值对呢?
How should I query key-value pairs in this scenario?
我正在尝试查询 2 个单独的键值对,如下所示:
AttributeTable 包含 3 列[感兴趣]
ID KeyColumn ValueColumn
12345 Sector Sector 1
12345 Group Group X
我需要查询得到以下输出:
ID Sector Group
12345 Sector 1 Group X
这是我目前拥有的:
SELECT ID, (SELECT VALUECOLUMN WHERE KEYCOLUMN = 'Sector') as Sector,(SELECT VALUECOLUMN WHERE KEYCOLUMN = 'Group') as Group
FROM AttributeTable
GROUP BY ID, KEYCOLUMN, VALUECOLUMN
显然,这是错误的,因为它给了我重复项[每个 ID 3 列各 1 行]
我该怎么做才能获得所需的输出?
测试数据
DECLARE @TABLE TABLE (ID INT, KeyColumn VARCHAR(10), ValueColumn VARCHAR(10))
INSERT INTO @TABLE VALUES
(12345 ,'Sector' , 'Sector 1'),
(12345 ,'Group' , 'Group X')
查询
SELECT *
FROM @TABLE
PIVOT (MAX(ValueColumn)
FOR KeyColumn
IN ([Sector] , [Group]))p
结果
╔═══════╦══════════╦═════════╗
║ ID ║ Sector ║ Group ║
╠═══════╬══════════╬═════════╣
║ 12345 ║ Sector 1 ║ Group X ║
╚═══════╩══════════╩═════════╝
如果您需要 PIVOT
的替代方案,我看到的用于实体-属性-值表的视图如下所示:
SELECT DISTINCT
a.ID
f1.ValueColumn AS "Sector",
f2.ValueColumn AS "Group"
FROM AttributeTable a
LEFT JOIN AttributeTable f1 ON f1.ID = a.ID AND f1.KeyColumn = 'Sector'
LEFT JOIN AttributeTable f2 ON f2.ID = a.ID AND f2.KeyColumn = 'Group'
以此类推,每个字段都有一个连接。动态生成它们是一个巨大的痛苦,而 PIVOT
只是稍微好一点,因为它也不是动态的。如果您有理由避免聚合(例如,如果 ValueColumn
是 BIT
),这可能会有所帮助。
我认为这会有所帮助。没有枢轴
SELECT a.ID,Max(decode(a.keycolumn,'Group',a.ValueColumn,null))AS "group",
Max(decode(a.keycolumn,'Sector',a.ValueColumn,null))AS "Sector"
FROM AttributeTable where KeyColumn in ( 'Group','Sector')
Group by a.id;
我正在尝试查询 2 个单独的键值对,如下所示: AttributeTable 包含 3 列[感兴趣]
ID KeyColumn ValueColumn
12345 Sector Sector 1
12345 Group Group X
我需要查询得到以下输出:
ID Sector Group
12345 Sector 1 Group X
这是我目前拥有的:
SELECT ID, (SELECT VALUECOLUMN WHERE KEYCOLUMN = 'Sector') as Sector,(SELECT VALUECOLUMN WHERE KEYCOLUMN = 'Group') as Group
FROM AttributeTable
GROUP BY ID, KEYCOLUMN, VALUECOLUMN
显然,这是错误的,因为它给了我重复项[每个 ID 3 列各 1 行]
我该怎么做才能获得所需的输出?
测试数据
DECLARE @TABLE TABLE (ID INT, KeyColumn VARCHAR(10), ValueColumn VARCHAR(10))
INSERT INTO @TABLE VALUES
(12345 ,'Sector' , 'Sector 1'),
(12345 ,'Group' , 'Group X')
查询
SELECT *
FROM @TABLE
PIVOT (MAX(ValueColumn)
FOR KeyColumn
IN ([Sector] , [Group]))p
结果
╔═══════╦══════════╦═════════╗
║ ID ║ Sector ║ Group ║
╠═══════╬══════════╬═════════╣
║ 12345 ║ Sector 1 ║ Group X ║
╚═══════╩══════════╩═════════╝
如果您需要 PIVOT
的替代方案,我看到的用于实体-属性-值表的视图如下所示:
SELECT DISTINCT
a.ID
f1.ValueColumn AS "Sector",
f2.ValueColumn AS "Group"
FROM AttributeTable a
LEFT JOIN AttributeTable f1 ON f1.ID = a.ID AND f1.KeyColumn = 'Sector'
LEFT JOIN AttributeTable f2 ON f2.ID = a.ID AND f2.KeyColumn = 'Group'
以此类推,每个字段都有一个连接。动态生成它们是一个巨大的痛苦,而 PIVOT
只是稍微好一点,因为它也不是动态的。如果您有理由避免聚合(例如,如果 ValueColumn
是 BIT
),这可能会有所帮助。
我认为这会有所帮助。没有枢轴
SELECT a.ID,Max(decode(a.keycolumn,'Group',a.ValueColumn,null))AS "group",
Max(decode(a.keycolumn,'Sector',a.ValueColumn,null))AS "Sector"
FROM AttributeTable where KeyColumn in ( 'Group','Sector')
Group by a.id;