如何使用 SQLite group_concat(X, Y) 从 JOIN 创建单个列



如果我没有正确措辞这个问题,请原谅我。 这是我正在尝试做的:

我在包含 GUID 的字符串列上连接了两个表。表 1 包含与我的数据对象有关的所有内容,而表 2 包含一个字符串列,我需要将其链接到表 1 中的记录。对于表 1 中的每条记录,表 2 中有 1..n 条记录。 我当前使用 INNER JOIN 的 SQLite 语句为表 1 中的每条记录返回 n 条记录,这不符合我的需求。 我想为表 1 中的每条记录取回 1 条记录。

但是,诀窍是我仍然希望查看表 2 中的所有字符串值,字符串连接为"值 1;值 2;值 3;等等"。

我尝试使用group_concat(X,Y)函数,如下所示:

SELECT o.ObservationGuid, o.ObservationID, o.ObservationParentTypeGuid, 
    o.ObservationTypeGuid, o.Name, o.ObservationParentName, o.GrowthStageGuid, 
    o.MorphologyTypeGuid, o.LifespanGuid, o.OrganismTypeGuid, o.ScientificName, 
    o.AgXID, o.AgGatewayID, o.Genus, o.Family, o.TaxonomicalOrder, o.Class, 
    o.Division, o.Kingdom, o.FavorableConditions, o.DescriptionSymptoms, 
    group_concat(oa.Name, '; ') 
FROM Observation o 
INNER JOIN ObservationAlias oa ON oa.ObservationGuid = o.ObservationGuid 
WHERE ObservationTypeGuid = '{E3149781-2423-4F15-8599-CB320E871284}' 
GROUP BY o.ObservationGuid COLLATE NOCASE

但这会导致根本不返回任何记录。 接下来,我尝试删除 GROUP BY 子句:

SELECT o.ObservationGuid, o.ObservationID, o.ObservationParentTypeGuid, 
    o.ObservationTypeGuid, o.Name, o.ObservationParentName, o.GrowthStageGuid, 
    o.MorphologyTypeGuid, o.LifespanGuid, o.OrganismTypeGuid, o.ScientificName, 
    o.AgXID, o.AgGatewayID, o.Genus, o.Family, o.TaxonomicalOrder, o.Class, 
    o.Division, o.Kingdom, o.FavorableConditions, o.DescriptionSymptoms, 
    group_concat(oa.Name, '; ') 
FROM Observation o 
INNER JOIN ObservationAlias oa ON oa.ObservationGuid = o.ObservationGuid 
WHERE ObservationTypeGuid = '{E3149781-2423-4F15-8599-CB320E871284}' 
COLLATE NOCASE

这将返回 1 条记录,由表 1 中的第一个匹配记录加上 oa 组成。名称字段包含表 2 中每条记录的字符串值,格式为"值 1;值 2;值 3;等等"

任何帮助将不胜感激!

我发现我做错了什么,这很尴尬。 COLLATE NOCASE必须在GROUP BY子句之前:

SELECT o.ObservationGuid, o.ObservationID, o.ObservationParentTypeGuid, 
    o.ObservationTypeGuid, o.Name, o.ObservationParentName, o.GrowthStageGuid, 
    o.MorphologyTypeGuid, o.LifespanGuid, o.OrganismTypeGuid, o.ScientificName, 
    o.AgXID, o.AgGatewayID, o.Genus, o.Family, o.TaxonomicalOrder, o.Class, 
    o.Division, o.Kingdom, o.FavorableConditions, o.DescriptionSymptoms, 
    group_concat(oa.Name, '; ') 
FROM Observation o 
INNER JOIN ObservationAlias oa ON oa.ObservationGuid = o.ObservationGuid 
WHERE ObservationTypeGuid = '{E3149781-2423-4F15-8599-CB320E871284}' 
COLLATE NOCASE
GROUP BY o.ObservationGuid

就是这样,现在查询仅返回表 1 中的唯一记录,包括表 2 中"名称"列中的每个值,这些值在我的结果集中连接成一个值。

最新更新