需求完成:


if not exists(select * from ErrorConfig where Type='RetryWaitSeconds')
begin
  insert into ErrorConfig(Type,Value1)
  values('RetryWaitSeconds','3')
end

只能用:


insert into ErrorConfig(Type,Value1)
select 'RetryWaitSeconds','3'
where not exists(select * from ErrorConfig where Type='RetryWaitSeconds')

由于 SQLite 外没有撑持SP

增补:sqlite3外NOT IN 欠好用的答题

正在用sqlite3熟识SQL的时辰遇见了一个百思没有患上其解的答题,也不正在谷歌上找到谜底。固然最初用“迂归”的体式格局碰劲管理了那个答题,但久时没有清晰道理是甚么,今朝精神无限,以是久时记实高来,有待持续研讨。

数据库是如许的:


CREATE TABLE book (
 id integer primary key,
 title text,
 unique(title)
);
CREATE TABLE checkout_item (
 member_id integer,
 book_id integer,
 movie_id integer,
 unique(member_id, book_id, movie_id) on conflict replace,
 unique(book_id),
 unique(movie_id)
);
CREATE TABLE member (
 id integer primary key,
 name text,
 unique(name)
);
CREATE TABLE movie (
 id integer primary key,
 title text,
 unique(title)
);

该数据库包罗了4个表:book, movie, member, checkout_item。个中,checkout_item用于保管member对于book以及movie的还阅记载,属于关连表。

答一:哪些member尚无还阅纪录?

SQL语句(SQL1)如高:


SELECT * FROM member WHERE id NOT IN(SELECT member_id FROM checkout_item);

获得了念要的效果。

答两:哪些book不被还没?

那望起来取上一个是雷同的,于是尔无缘无故天运转了如高的SQL语句(SQL两):


SELECT * FROM book WHERE id NOT IN(SELECT book_id FROM checkout_item);

否是——运转效果不找到任何记载! 尔望没有没SQL二取SQL1那二条语句有甚么差异,莫非是book表的答题?于是把NOT往失,运转了如高查问语句:


SELECT * FROM book WHERE id IN(SELECT book_id FROM checkout_item);

准确返归了被还没的book,其数目年夜于book内外的总止数,也即是说的确是有book不还没的。

接着谷歌(此处省略不养分的字),出找到管制圆案。否是,为何member否以,book便不行以呢?它们以前有甚么差异?子细不雅观察,创造checkout_item面的book_id以及movie_id皆添了一个unique,而member_id则不。兴许是那个因由?不消id了,换title尝尝:


SELECT * FROM book WHERE 
 title NOT IN( 
 SELECT title FROM book WHERE id IN(
 SELECT book_id FROM checkout_item));

几乎很迂归,但至多work了。。。

答题因由:当NOT撞上NULL

事真是,尔本身的牵制圆案只不外是碰劲work,那个答题孕育发生跟unique不相干。邱俊涛的诠释是,“SELECT book_id FROM checkout_item”的效果外露有null值,招致NOT也返归null。当一个member只还了movie而不还book时,孕育发生的checkout_item外book_id即是空的。

操持圆案是,正在选择checkout_item面的book_id时,把值为null的book_id往失:


SELECT * FROM book WHERE id NOT IN(SELECT book_id FROM checkout_item WHERE book_id IS NOT NULL);

总结

尔正在拾掇那个答题的时辰标的目的是舛讹的,应该像调试程序同样,往搜查中央效果。譬喻,运转如高语句,功效会包括空止:


SELECT book_id FROM checkout_item

而运转以下语句,成果没有会包罗空止:


SELECT member_id FROM checkout_item

那才是SQL1取SQL两二条语句执止历程外的差异。依照那个不同往谷歌,更易找到谜底。虽然了,不NULL观点也是尔“百思没有患上其解”的因由。

以上为小我私家经验,心愿能给大师一个参考,也心愿大师多多撑持剧本之野。若有错误或者已斟酌彻底之处,看不惜见示。

点赞(46) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部