求SQL语句:存在就跳过,不存在就插入记录,从字段ID=1开始,到字段ID=1某个值结束?
如题:我现在有一张表,其中里面有字段为HangNo,字段类型为int,我想通过一条SQL语句来实现:循环插入记录操作,让记录的HangNo=1插入到HangNo=n,其中n大于或等于1,如果在表中已经存在HangNo等于要插入的值,则跳过该记录
表中可能存在这些情况:
1,表中一条记录都没有,HangNo字段从1到n,插入n条记录;
2. 表中有一些记录,如果存在HangNo字段值等于要插入的值,则跳过该记录,不存在则插入该记录。
3. 表中存在HangNo字段从1到n的记录,甚至HangNo字段的记录个数超出n条,实际并不会插入任何记录。
这个SQL循环插入不存在的记录的语句该怎么写?最好能MySQL和SQL SERVER中都支持该语法
[解决办法]
- SQL code
--如何用"最小缺失数"实现确实日期的自动补全-->生成测试数据:GOIF OBJECT_ID('TBL')IS NOT NULLDROP TABLE TBLGOCREATE TABLE TBL(日期 DATE,备注 VARCHAR(100))GOINSERT TBLSELECT '2012-03-02','B' UNION ALLSELECT '2012-03-05','C' UNION ALLSELECT '2012-03-06','D' UNION ALLSELECT '2012-03-07','E' UNION ALLSELECT '2012-03-09','F' UNION ALLSELECT '2012-03-11','G' UNION ALLSELECT '2012-03-12','H' UNION ALLSELECT '2012-03-13','I' UNION ALLSELECT '2012-03-15','J' UNION ALLSELECT '2012-03-19','K' UNION ALLSELECT '2012-03-20','L'GOIF OBJECT_ID('P_SP')IS NOT NULLDROP PROC P_SPGOCREATE PROC P_SP @STARTTIME DATE,--用来传入起始日期@ENDTIME DATE--用来传入截止日期ASDECLARE @SQL VARCHAR(100)SET @SQL='SELECT * FROM TBL ORDER BY 日期'DECLARE @MINMISS DATESET @MINMISS=(SELECT COALESCE(DATEADD(DD,1,MIN(A.日期)),@STARTTIME) AS MISSINGFROM TBL AWHERE NOT EXISTS(SELECT * FROM TBL B WHERE B.日期=DATEADD(DD,1,A.日期))AND EXISTS (SELECT 1 FROM TBL WHERE 日期=@STARTTIME))PRINT @MINMISSWHILE @MINMISS<=@ENDTIMEBEGININSERT TBL(日期) VALUES(@MINMISS)SELECT @MINMISS=(SELECT DATEADD(DD,1,MIN(A.日期))FROM TBL AWHERE NOT EXISTS(SELECT * FROM TBL B WHERE B.日期=DATEADD(DD,1,A.日期)))ENDEXEC(@SQL)EXEC P_SP '2012-03-01','2012-03-20'/*日期 备注2012-03-01 NULL2012-03-02 B2012-03-03 NULL2012-03-04 NULL2012-03-05 C2012-03-06 D2012-03-07 E2012-03-08 NULL2012-03-09 F2012-03-10 NULL2012-03-11 G2012-03-12 H2012-03-13 I2012-03-14 NULL2012-03-15 J2012-03-16 NULL2012-03-17 NULL2012-03-18 NULL2012-03-19 K2012-03-20 L*/类似问题,刚刚写好的,给你参考一下
[解决办法]
其它字段插入时怎么处理,给出输入格式
[解决办法]
假如你的1到N在某个表tb1,要插入表tb2
insert into tb2 select ... from tb1 where not exists(select 1 from tb2 where tb2.关键字 = tb1.关键字)
如果不存在表tb1,则可以使用系统表sysobjects来生成你的序列表.
select (select count(1) from sysobjects m where m.id < n.id) + 1 as px from sysobjects n