在上一篇文章中,我在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)
group_concat(X)
为此使用聚合函数:
SELECT (a.LastName || " " || a.FirstName) AS AttendeeName
, a.PhotoURI
, group_concat(c.CompanyName) AS Companies
, group_concat(c.CompanyId) AS CompanyIds
FROM Attendee AS a
JOIN CompanyAttendeeRelation AS ca ON ca.AttendeeId = a.AttendeeId
JOIN Company AS c ON c.CompanyId = ca.CompanyId
GROUP BY a.LastName, a.Firstname, a.PhotoURI;
(使用表别名使其更短且更易于阅读。)
NULL
值从结果中排除。手册:
所有非NULL值的串联
根据手册,和 中元素 的 顺序
是任意的:CompanyIds``Companies
串联元素的顺序是任意的。
另请注意,“任意”与“随机”不同。group_concat
像其他聚合函数一样,按收到的顺序处理行集。没有any ORDER BY
,该顺序由执行的查询计划决定。有一个在关系数据库的表中没有的自然顺序(你可以不依赖于插入顺序 在所有
)。但是group_concat()
,同一SELECT
列表中的的两个实例均以 相同的
顺序处理行,因此in中的第一个IDCompanyIds
对应于中的第一个名称Companies
。
您可以ORDER BY
在子查询中强加您的订单。这是实现细节,但极不可能更改。喜欢:
SELECT (LastName || " " || FirstName) AS AttendeeName
, PhotoURI
, group_concat(CompanyName) AS Companies
, group_concat(CompanyId) AS CompanyIds
FROM (
SELECT a.LastName, a.FirstName, a.PhotoURI, c.CompanyName, c.CompanyId
FROM Attendee AS a
JOIN CompanyAttendeeRelation AS ca ON ca.AttendeeId = a.AttendeeId
JOIN Company AS c ON c.CompanyId = ca.CompanyId
ORDER BY 1,2,3,4,5 -- or whatever you need
) AS sub
GROUP BY LastName, Firstname, PhotoURI;
关于(可选)序号的手册ORDER BY
:
如果ORDER BY表达式是常数整数K,则该表达式被视为结果集的第K列的别名(列从1到从左到右编号)。
使用GROUP BY
列表作为ORDER BY
最佳结果的前导表达式。
在对派生表 进行 排序 后 ,不要对其进行任何可能重新排列的操作(例如将子查询联接到另一个表等)。
问题内容: 考虑以下列表: 我该如何实现? 我试过了: 但是,只有当我按一定顺序具有元组的元素时,它才起作用,这意味着它将导致以下结果: 问题答案: 您可以将元组视为图形中的边,而将目标视为在图形中查找连接的组件。然后,您可以简单地遍历顶点(元组中的项),并为尚未访问的每个顶点执行DFS生成组件: 输出: 注意,在上面,组件和组件中的元素都是随机顺序。
问题内容: 我们有些SQL杂语。说我有一个看起来像这样的结果… 61E77D90-D53D-4E2E-A09E-9D6F012EB59C | A 61E77D90-D53D-4E2E-A09E-9D6F012EB59C | B 61E77D90-D53D-4E2E-A09E-9D6F012EB59C | C 61E77D90-D53D-4E2E-A09E-9D6F012EB59C | D 7ce9
问题内容: 我正在尝试不同的JOIN查询,但没有得到想要的结果。 我有2张桌子: 我找不到想要的结果。 我想得到以下结果: 问题答案: 您不能具有这样的动态列数,但是可以 将数据连接 成字符串: 或者您可以使用或手动 旋转行( 我更喜欢后一种方法,对我来说似乎更灵活,但是在某些情况下可以大大减少代码量): 您还可以将前面的语句转换为 动态SQL, 如下所示:
问题内容: 我有第1列和第2列,并希望将它们合并到同一表的第3列中。如果第2列为空,则显示第1列的值;如果第1列为空,则它们显示第2列的数据。如果它们都为空,则显示为空。我尝试了两件事: 1)使用CONCAT 。 仅当两个列都不为null时,它才合并列。否则,它只是将null声明为null。 2)使用(第1栏+第2栏)。 。 没有显示所需的输出。 我正在用Java编写此代码。谢谢 问题答案: us
问题内容: 我有两个查询,每个查询返回一个结果,即一个数字 结果 。 结果 我希望将两个结果合并为一行记录,即 问题答案: 您可以使用: 说明:您可以在select语句中选择单个值作为字段,因此可以编写如下内容: 这仅对 标量 查询有效 ,这意味着子查询应具有精确的1列,最多1行。如果有0行,则ValueFromY将返回,而如果有1行以上,则查询将失败。 (在SQL Server,MySQL和其他
我有两排像这样的, 我希望将它们合并为一个单独的: 不知道如何在熊猫身上做到这一点。任何提示都将受到高度赞赏!提前谢谢