如何使用 sqlite 中的视图在特定行中添加列?

Posted

技术标签:

【中文标题】如何使用 sqlite 中的视图在特定行中添加列?【英文标题】:How to add a column in specific row using a view in sqlite? 【发布时间】:2013-04-07 05:26:19 【问题描述】:

我在 sqlite 的数据库中有 3 个表

表 A

+-----+-------+
|  id | name  |
+-----+-------+
| 1   | Ann   |
| 2   | Bill  |
| 3   | Mike  |
| 4   | Zoey  |
+-----+-------+

表 B

+-----+-----+
| idA | idC |
+-----+-----+
| 1   | 1   |
| 1   | 2   |
| 2   | 3   |
| 3   | 2   |
| 4   | 1   |
+-----+-----+

表 C

+-----+-----+
|  id | type|
+-----+-----+
| 1   | x   |
| 2   | y   |
| 3   | z   |
+-----+-----+

我试过了:

CREATE VIEW test AS SELECT A.id, A.name, C.type
FROM A, B, C
WHERE B.idA = A.id
AND B.idB = B.id

然后我得到:


**View test**
+-----+-------+-------+
|  id | name  | type  |
+-----+-------+-------+
| 1   | Ann   | x     |
| 1   | Ann   | y     |
| 2   | Bill  | z     |
| 3   | Mike  | y     |
| 4   | Zoey  | x     |
+-----+-------+-------+

但我想做这样的事情

+-----+-------+-------+
|  id | name  | type  |
+-----+-------+-------+
| 1   | Ann   | x,y   |
| 2   | Bill  | z     |
| 3   | Mike  | y     |
| 4   | Zoey  | x     |
+-----+-------+-------+

不重复任何行,这可能吗?

【问题讨论】:

【参考方案1】:

SQLite 支持GROUP_CONCAT()

CREATE VIEW test 
AS
SELECT  A.id, A.name, GROUP_CONCAT(C.type) AS Type
FROM    A, B, C
WHERE   B.idA = A.id AND 
        B.idC = C.id
GROUP   BY A.id, A.name
SQLFiddle Demo

输出

╔════╦══════╦══════╗
║ id ║ name ║ Type ║
╠════╬══════╬══════╣
║  1 ║ Ann  ║ x,y  ║
║  2 ║ Bill ║ z    ║
║  3 ║ Mike ║ y    ║
║  4 ║ Zoey ║ x    ║
╚════╩══════╩══════╝

来自 SQLite 文档

group_concat() 函数返回一个字符串,它是 X 的所有非 NULL 值的串联。如果存在参数 Y 然后它用作 X 实例之间的分隔符。逗号 (",") 如果省略 Y,则用作分隔符。的顺序 串联的元素是任意的。

【讨论】:

【参考方案2】:

在定义视图时试试这个查询:

SELECT A.id, A.name, GROUP_CONCAT(C.type) type
FROM A
INNER JOIN B ON B.idA = A.id
INNER JOIN C ON C.id = B.idC
GROUP BY A.id

查看GROUP_CONCAT()mysql 文档

【讨论】:

以上是关于如何使用 sqlite 中的视图在特定行中添加列?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 qtreeview 中的父行中获取特定列

如何在Magento管理面板中添加Grid行中的按钮?

如何从sqlite中的多个表中选择特定列?

sqlite - 根据字段值将 2 行中的相同字段组合成 2 列

如何使用Python计算数组特定行中的值[重复]

从 SQLite 中的所有行中减去平均值