需求完成:
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观点也是尔“百思没有患上其解”的因由。
以上为小我私家经验,心愿能给大师一个参考,也心愿大师多多撑持剧本之野。若有错误或者已斟酌彻底之处,看不惜见示。

发表评论 取消回复