在插入之前检查现有行

时间:2011-03-10 20:42:22

标签: sql sql-server-2005 tsql select insert

表1列:

  

clinic_code,schedule_date,schedule_time,source_id

表2列:

  

clinic_code,schedule_date,schedule_time

存储过程包括:
1.删​​除Table1中的所有记录,其中clinic_code ='ABC'和schedule_date = xyz 2.将table2中的所有记录INSERT,table2.clinic_code ='ABC'和table2.schedule_date = xyz插入table1。

我想在第2步中进行更改。
* 2。 INSERT来自table2的所有记录,其中table2.clinic_code ='ABC'和table2.schedule_date = xyz,但不要覆盖table1中source_id = 2的那些行。

这是步骤2中的原始插入语句:

INSERT INTO table1 (col1, col2, col3)
SELECT table2.col1, table3.col2, table2.col3
FROM table2
INNER JOIN table3 ON table2.col3 = table3.col5 AND etc...

表名和其他列已被省略,如果它有用,我可以输入确切的列数。

2 个答案:

答案 0 :(得分:1)

我不确定我是否完全遵循,因为如果你将行插入table1,table1.col3将没有这些行的值。如果你只是想避免使用table1.col3 = 2,你可以使用这样的where子句:

INSERT INTO table1 (col1, col2, col3)
SELECT table2.col1, table3.col2, table2.col3
FROM table2
INNER JOIN table3 ON table2.col3 = table3.col5 AND etc...
WHERE table2.col3 <> 2

这会避免将值2插入table1.col3,因为table2.col3是你从中拉出来的。如果我错过了这里的要点,请告诉我,但是应该这样做。

编辑 - 鉴于你已经说过table1和table2之间的记录是相似的,假设你可以在两个表之间加入一个列,你可以这样做:

INSERT INTO table1 (col1, col2, col3)
SELECT table2.col1, table3.col2, table2.col3
FROM table2
INNER JOIN table3 ON table2.col3 = table3.col5 AND etc...
LEFT OUTER JOIN table1 t1 ON tl.colX = table2.colX
WHERE table1.col3 <> 2

这个想法是你现在已经在SELECT中包含了table1,因此也可以在WHERE子句中包含它。 (请原谅我,如果其他SQL风格的别名语法已关闭,我在T-SQL中经验丰富。)

答案 1 :(得分:0)

我不知道你使用的是哪个SQL,所以这里是一个标准的SQL脚本:

BEGIN TRANSACTION ;
       IF NOT EXISTS ( SELECT * FROM dbo.table1 WHERE   col3 = 2 )
       BEGIN ;
           ...your insert goes here
       END ;
COMMIT ;