sqlite - 高级SQLite更新表查询

标签 sqlite

我正在尝试更新数据库表B,如下所示:

Table A:
id, amount, date, b_id
1,200,6/31/2012,1
2,300,6/31/2012,1
3,400,6/29/2012,2
4,200,6/31/2012,1
5,200,6/31/2012,2
6,200,6/31/2012,1
7,200,6/31/2012,2
8,200,6/31/2012,2

Table B:
id, b_amount, b_date
1,0,0
2,0,0
3,0,0


现在通过此查询,我可以一次选择所需的所有数据:

SELECT A.*,B.* FROM A LEFT JOIN B ON B.id=A.b_id WHERE A.b_id>0 GROUP BY B.id

id, amount, date, b_id, id, b_amount, b_date
1,200,6/31/2012,1,1,0,0
3,400,6/29/2012,1,1,0,0


现在,我只想将选定的列金额复制到b_amount并将日期复制到b_date

b_amount=amount, b_date=date


导致

id, amount, date, b_id, id, b_amount, b_date
1,200,6/31/2012,1,1,200,6/31/2012
3,400,6/29/2012,1,1,400,6/29/2012


我尝试了COALESCE(),但没有成功。
有经验的人对此有解决方案吗?

解:

由于下面的答案,我设法提出了这一点。这可能不是最有效的方法,但是一次只更新就可以了。这将为您插入每个组的第一个对应条目。

REPLACE INTO A SELECT id, amount, date FROM 
(SELECT  A.id, A.amount, B.id as Bid FROM A INNER JOIN B ON (B.id=A.B_id)
ORDER BY A.id DESC) 
GROUP BY Bid;

最佳答案

因此,您正在寻找的似乎是UPDATE查询中的JOIN。在mySQL中,您将使用

UPDATE B INNER JOIN A ON B.id=A.b_id SET B.amount=A.amount, B.date=A.date;


但是sqlite不支持此功能,因为this可能相关的问题指出了这一点。但是,有一种使用REPLACE的解决方法:

REPLACE INTO B 
SELECT B.id, A.amount, A.date FROM A 
LEFT JOIN B ON B.id=A.b_id 
WHERE A.b_id>0 GROUP BY B.id;


该查询将只为应该保留其状态的所有列填充表B的值,并为复制的值填充表A的值。确保SELECT语句中的列顺序符合表B的列顺序,并提及所有列,否则您将丢失这些字段的数据。这可能对将来对表B的更改很危险。因此,在更改表B时,请记住更改此查询的列顺序/状态。

有点偏离主题,因为您没有要求:A.b_id显然是B.id的外键。看来您正在使用值0作为外键来表示B中没有相应的条目。(从SELECT中使用WHERE A.b_id>0推断出来。)您应该考虑使用null值。使用INNER JOIN时,可以完全删除WHERE子句,而不是LEFT JOIN。然后,星展银行将整理所有不满意的关系。

关于sqlite - 高级SQLite更新表查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10882914/

相关文章:

ios - 备份还原SQLite核心数据iphone

sql - 如何在 Android 中获取页面中的记录

c# - 等待任务中的列表<MyClass>

sql - 类似查询的不同结果取决于sqlite3中日期字符串的格式

编译 INSERT 时出现 Android SQLiteException : near ",": syntax error: ,

android - 在sqlite android中存储以0开头的数字

sql - SQLite 中的物化 CTE

python - 从 sqlite3 转储数据时出错

java - Android:是否应该以异步方式访问应用程序中的数据库?

c++ - SQLite C/C++ API 无符号字符 *