SQLITE:如果共享列,则将行合并为单行
从上一篇文章中,我在 sqlite3 中有以下视图:
CREATE View AttendeeTableView AS
SELECT (LastName || " " || FirstName) as AttendeeName,
CompanyName,
PhotoURI,
CompanyAttendeeRelation.CompanyId,
CompanyAttendeeRelation.AttendeeId
FROM Attendee
JOIN CompanyAttendeeRelation on CompanyAttendeeRelation.AttendeeId = Attendee.AttendeeId
ORDER BY LastName;
现在,由于数据是根据 Attendee
和 Company
之间的多对多关系生成的,我可以得到结果,例如:
Doe John | company A | johnPic.png | 1 | 15
Doe John | company B | johnPic.png | 2 | 15
我想做的是,在有多个公司的情况下(如上所示),创建一个输出的查询:
Doe John | company A company B | johnPic.png | 1 2 | 15
另一个输出的查询:
Doe John | company A | company B | johnPic.png | 1 | 2 | 15
所以我本质上需要知道如何合并特定列具有不同的行 该表中的值。
有什么想法吗?
以防万一,第一个查询中的 company A company B
显然是文本串联,即类似于 (row1.CompanyName || " " || row2.CompanyName)< /代码>
From a previous post, I have the following view in sqlite3:
CREATE View AttendeeTableView AS
SELECT (LastName || " " || FirstName) as AttendeeName,
CompanyName,
PhotoURI,
CompanyAttendeeRelation.CompanyId,
CompanyAttendeeRelation.AttendeeId
FROM Attendee
JOIN CompanyAttendeeRelation on CompanyAttendeeRelation.AttendeeId = Attendee.AttendeeId
ORDER BY LastName;
Now, since the data is generated from a many-to-many relation between Attendee
and Company
, I can get results such as:
Doe John | company A | johnPic.png | 1 | 15
Doe John | company B | johnPic.png | 2 | 15
What I'd like to do is, in cases where there's more than one company (like above), create a query that outputs:
Doe John | company A company B | johnPic.png | 1 2 | 15
And another that outputs:
Doe John | company A | company B | johnPic.png | 1 | 2 | 15
So I need to know essentially how to merge a specific column for rows that have different
values in that table.
Any ideas?
Just in case, company A company B
in the first query is obviously text concatenation, That is, something along the lines of (row1.CompanyName || " " || row2.CompanyName)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
使用聚合函数
group_concat(X)
为此:(使用表别名使其更短且更易于阅读。)
NULL
值从结果中排除。 手册:CompanyIds
和Companies
中的元素顺序是任意的,根据 手册:另请注意,“任意”与“随机”不同。
group_concat
与其他聚合函数一样,按照收到的顺序处理行集。如果没有任何ORDER BY
,则该顺序由执行的任何查询计划决定。关系数据库的表中没有自然顺序(您根本不能依赖插入顺序)。但同一SELECT
列表中的两个group_concat()
实例以相同的顺序处理行,以便CompanyIds< 中的第一个 ID /code> 对应于
Companies
中的第一个名称。您可以在子查询中使用
ORDER BY
强加您的订单。这是一个实现细节,但不太可能改变。例如:有关
ORDER BY代码>:
使用
GROUP BY
列表作为前导ORDER BY
表达式以获得最佳结果。排序后,不要对派生表执行任何可能会重新排列的操作(例如将子查询连接到另一个表等)。
最后,请注意,其他 RDBMS 中的类似聚合函数的行为可能略有不同。相关:
Use the aggregate function
group_concat(X)
for that:(Using table aliases to make it shorter and easier to read.)
NULL
values are excluded from the result. The manual:The order of elements in
CompanyIds
andCompanies
is arbitrary, according to the manual:Also note that "arbitrary" is not the same as "random".
group_concat
, like other aggregate functions, processes the set of rows in the order received. Without anyORDER BY
, that order is dictated by whatever query plan is executed. There is no natural order in tables of relational databases (you cannot rely on insert order at all). But both instances ofgroup_concat()
in the sameSELECT
list process rows in the same order so that the 1st ID inCompanyIds
corresponds to the 1st name inCompanies
.You can impose your order with
ORDER BY
in a subquery. It's an implementation detail, but it's highly unlikely to change. Like:The manual about the (optional) ordinal numbers in
ORDER BY
:Use the
GROUP BY
list as leadingORDER BY
expressions for best results.Don't do anything with the derived table after ordering that might rearrange it (like joining the subquery to another table etc.)
Finally, note that similar aggregate functions in other RDBMS can behave slightly differently. Related:
这篇文章的答案将为您提供帮助变成
The answer from this post will help you turn
into
我认为内部选择可能会有所帮助,例如:
I'm thinking a inner select might help, like: