已知一个表 table
里面有两个字段 A1 和 A2
如何用动态语句 判断 A1 = A , A2=B 的数据是否存在,如果不存在,就添加一条数据, A1 = A , A2 = B
谢谢
10 个解决方案
#1
[code=sql]INSERT table1 (A1,A2)
SELECT 'A','B'
WHERE NOT EXISTS (SELECT *
FROM table1
WHERE A1 = 'A'
AND A2 = 'B'
)[/code=sql]
SELECT 'A','B'
WHERE NOT EXISTS (SELECT *
FROM table1
WHERE A1 = 'A'
AND A2 = 'B'
)[/code=sql]
#2
if not exists (select 1 from 表table where A1 = 'A' and A2='B')
insert 表table(A1,A2) values('A','B')
insert 表table(A1,A2) values('A','B')
#3
A和B是值还是参数呢?
是‘A’和‘B’这样的值的话,1楼可行。
要是参数的话,就得用过程了,或者程序拼语句。
是‘A’和‘B’这样的值的话,1楼可行。
要是参数的话,就得用过程了,或者程序拼语句。
#4
-- 凑个人数
drop table test
go
create table test (A1 int , A2 int )
go
insert into test(A1 , A2) values(1,2),(3,4)
go
insert into test(A1 , A2)
select 5 ,6
except
select A1 , A2 from test where A1 =5 and A2 = 6
go 2 -- 执行 2 次
select * from test
go
(2 行受影响)
开始执行循环
(1 行受影响)
(0 行受影响)
批处理执行已完成 2 次。
A1 A2
----------- -----------
1 2
3 4
5 6
(3 行受影响)
#5
我有印象了~
遇到这种避免重复插入的
可以先把要插入的数据都存在临时表里,
插入时加where not exists(...)判断.
这样多进程并发执行也不会插入重复值.
遇到这种避免重复插入的
可以先把要插入的数据都存在临时表里,
插入时加where not exists(...)判断.
这样多进程并发执行也不会插入重复值.
insert into 表([字段列表])
select [字段列表]
from [临时表] a
where not exists(select 1
from 表 b
where b.A1=a.A1 AND b.A2=a.A2)
#6
参数可以用 string.format 拼接
#7
1楼的方法,把A和B替换成 string.format 拼的字符串
#8
A和B是值还是参数呢?
是‘A’和‘B’这样的值的话,1楼可行。
要是参数的话,就得用过程了,或者程序拼语句。
参数可以用 string.format 拼接
1楼的方法,把A和B替换成 string.format 拼的字符串
一楼的测试了,没有提示错误,但数据没有添加
#9
数据已存在就不添加,这不是你的目的吗!
你把子查询部分执行一下,可以验证的。
你把子查询部分执行一下,可以验证的。
#10
把跟出来的语句发一下。
#1
[code=sql]INSERT table1 (A1,A2)
SELECT 'A','B'
WHERE NOT EXISTS (SELECT *
FROM table1
WHERE A1 = 'A'
AND A2 = 'B'
)[/code=sql]
SELECT 'A','B'
WHERE NOT EXISTS (SELECT *
FROM table1
WHERE A1 = 'A'
AND A2 = 'B'
)[/code=sql]
#2
if not exists (select 1 from 表table where A1 = 'A' and A2='B')
insert 表table(A1,A2) values('A','B')
insert 表table(A1,A2) values('A','B')
#3
A和B是值还是参数呢?
是‘A’和‘B’这样的值的话,1楼可行。
要是参数的话,就得用过程了,或者程序拼语句。
是‘A’和‘B’这样的值的话,1楼可行。
要是参数的话,就得用过程了,或者程序拼语句。
#4
-- 凑个人数
drop table test
go
create table test (A1 int , A2 int )
go
insert into test(A1 , A2) values(1,2),(3,4)
go
insert into test(A1 , A2)
select 5 ,6
except
select A1 , A2 from test where A1 =5 and A2 = 6
go 2 -- 执行 2 次
select * from test
go
(2 行受影响)
开始执行循环
(1 行受影响)
(0 行受影响)
批处理执行已完成 2 次。
A1 A2
----------- -----------
1 2
3 4
5 6
(3 行受影响)
#5
我有印象了~
遇到这种避免重复插入的
可以先把要插入的数据都存在临时表里,
插入时加where not exists(...)判断.
这样多进程并发执行也不会插入重复值.
遇到这种避免重复插入的
可以先把要插入的数据都存在临时表里,
插入时加where not exists(...)判断.
这样多进程并发执行也不会插入重复值.
insert into 表([字段列表])
select [字段列表]
from [临时表] a
where not exists(select 1
from 表 b
where b.A1=a.A1 AND b.A2=a.A2)
#6
A和B是值还是参数呢?
是‘A’和‘B’这样的值的话,1楼可行。
要是参数的话,就得用过程了,或者程序拼语句。
参数可以用 string.format 拼接
#7
A和B是值还是参数呢?
是‘A’和‘B’这样的值的话,1楼可行。
要是参数的话,就得用过程了,或者程序拼语句。
参数可以用 string.format 拼接
1楼的方法,把A和B替换成 string.format 拼的字符串
#8
A和B是值还是参数呢?
是‘A’和‘B’这样的值的话,1楼可行。
要是参数的话,就得用过程了,或者程序拼语句。
参数可以用 string.format 拼接
1楼的方法,把A和B替换成 string.format 拼的字符串
一楼的测试了,没有提示错误,但数据没有添加
#9
数据已存在就不添加,这不是你的目的吗!
你把子查询部分执行一下,可以验证的。
你把子查询部分执行一下,可以验证的。
#10
把跟出来的语句发一下。