我的AWS QLDB表中有下表:
INSERT INTO Testing << {
'MyId': 1,
'MyList': [ 'Item1', 'Item2', 'Item3']
},
{
'MyId': 2,
'MyList': [ 'Item2', 'Item3', 'Item4']
},
{
'MyId': 3,
'MyList': [ 'Item4', 'Item5', 'Item6']
}
>>
我需要能够获得所有包含项目列表(不是来自另一个表(的文档,我正在使用以下查询:
SELECT *
FROM Testing AS t,
t.MyList AS l
WHERE l IN ('Item1', 'Item2', 'Item4')
然而,这会产生以下输出
+------+---------------------------+---------+
| MyId | MyList | _3 |
+------+---------------------------+---------+
| 3 | ["Item4","Item5","Item6"] | "Item4" |
+------+---------------------------+---------+
| 1 | ["Item1","Item2","Item3"] | "Item1" |
+------+---------------------------+---------+
| 1 | ["Item1","Item2","Item3"] | "Item2" |
+------+---------------------------+---------+
| 2 | ["Item2","Item3","Item4"] | "Item2" |
+------+---------------------------+---------+
| 2 | ["Item2","Item3","Item4"] | "Item4" |
+------+---------------------------+---------+
我想只得到三个不同的行。根据我在尝试使用DISTINCT
时遇到的错误,QLDB似乎不支持它,但我也更喜欢在我的SELECT
中使用*
,所以我正在尝试使用GROUP BY
SELECT *
FROM Testing AS t,
t.MyList AS l
WHERE l IN ('Item1', 'Item2', 'Item4')
GROUP BY t.MyId
但这会产生以下错误:
开始查询错误
语义错误:第行、第列:没有名为'$__partiql__group_by_1_item_0'的变量;没有名为"$__partiql__group_by_1_item_0"的此类变量(服务:AmazonQLDBSession;状态代码:400;错误代码:BadRequestException;请求ID:65vrQHytqHdEL3o9Ym9Xn4(
QLDB中当前不支持DISTINCT
和GROUP BY
,如SELECT引用中的省略所示。不幸的是,在这种情况下,错误消息具有误导性。
假设您的MyId
列本身是唯一的,您可以通过检查列表中每个项目的包含情况来过滤列表来表达您想要的内容,例如:
SELECT *
FROM Testing AS t
WHERE 'Item1' IN t.MyList OR 'Item2' IN t.MyList OR 'Item3' IN t.MyList
如果你想进一步过滤生成的列表,你可以用你的原始过滤器添加一个嵌套的SELECT
,如下所述:
SELECT t.MyId, (SELECT VALUE l FROM t.MyList WHERE l IN ('Item1', 'Item2', 'Item3'))
FROM Testing AS t
WHERE 'Item1' IN t.MyList OR 'Item2' IN t.MyList OR 'Item3' IN t.MyList
虽然这有点尴尬,但你可能无论如何都不想做GROUP BY
,因为当每个t
的items
都包含在整个数据集中时,它会在整个数据集中分组(需要完全聚合(。