本文主要介绍SQLite的操作实现类似if not exist的功能,有很好的参考价值,希望对大家有所帮助。来和边肖一起看看吧。

需要实现:

如果不存在(select * from ErrorConfig,其中Type=’RetryWaitSeconds ‘)

开始

插入到ErrorConfig(类型,值1)

值(‘ RetryWaitSeconds ‘,’ 3 ‘)

目标

仅使用:

插入到ErrorConfig(类型,值1)

选择“RetryWaitSeconds”,“3”

不存在时(select * from error config where Type=’ RetryWaitSeconds ‘)

因为SQLite不支持SP

补充:sqlite3中没有的不好用的问题

用sqlite3熟悉SQL的时候,遇到了一个莫名其妙的问题,在google上也没有找到答案。虽然最终通过“迂回”的方式解决了问题,但暂时不清楚是什么原理。目前精力有限,暂时记录,有待进一步研究。

数据库如下所示:

创建表格簿(

id整数主键,

标题文本,

独特(标题)

);

创建表checkout_item(

member_id整数,

book_id整数,

电影id整数,

冲突时唯一(成员标识,图书标识,电影标识)替换,

唯一(book_id),

唯一(电影id)

);

创建表成员(

id整数主键,

名称文本,

唯一(名称)

);

创建表格电影(

id整数主键,

标题文本,

独特(标题)

);

数据库包含四个表:book、movie、member、checkout _ item。其中checkout_item用于保存图书和电影按成员的借阅记录,属于关系表。

问:哪位成员还没有借唱片?

SQL语句(SQL1)如下所示:

1SELECT * FROM不在的成员(SELECT member _ id FROM check out _ item);

得到了想要的结果。

问:哪些书没有被借出?

这看起来与上一个相似,所以我自然地运行了下面的SQL语句(SQL2):

1 SELECT * FROM book WHERE id NOT IN(SELECT book _ id FROM check out _ item);

但是在——的运行结果中没有找到记录!我看不出SQL2和SQL1有什么区别。是书桌吗?因此,删除NOT并运行以下查询语句:

1 SELECT * FROM book WHERE id IN(SELECT book _ id FROM check out _ item);

借出的书归还正确,数量小于图书表中图书总数,说明还有未借出的图书。

然后谷歌(此处省略无营养这个词),也没有找到解决方案。但是,为什么一个会员可以,一本书不行?他们之前有什么区别?仔细观察发现,checkout_item中的book_id和movie_id有唯一的加法,而member_id没有。也许这就是原因?不需要id,换个标题试试:

SELECT * FROM book WHERE

标题不在(

从id所在的图书中选择标题(

SELECT book _ id FROM check out _ item));

这真的很迂回,但至少它的工作。

原因:当NOT命中NULL时

事实是,我自己的解决方案刚好管用,这个问题和unique无关。邱的解释是“从checkout_item中选择book_id”的结果包含null值,导致NOT返回null。当会员只借电影不借书时,生成的checkout_item中的book_id为空。

解决方案是在checkout_item中选择book_id时删除空的book_id:

1 SELECT * FROM book WHERE id NOT IN(SELECT book _ id FROM check out _ item WHERE book _ id NOT NULL);

摘要

我在解决这个问题时走错了方向。我应该像调试程序一样检查中间结果。例如,如果运行以下语句,结果将包含空行:

1从checkout_item中选择book_id

运行以下语句时,结果将不包含空行:

1从checkout_item选择member_id

这就是SQL1和SQL2语句执行的区别。根据这种差异,去谷歌更容易找到答案。当然,NULL这个概念的缺失也是我“不解”的原因。

来源:剧本之家

地址:https://www.jb51.net/article/203321.htm

发表回复

后才能评论