检查做插入

问题描述:

表1列之前,现有行:检查做插入

clinic_code,schedule_date,schedule_time,SOURCE_ID

表2列:

clinic_code,schedule_date,schedule_time

有一个存储程序执行:
1.删除Table1中的所有记录,其中clinic_code ='ABC'AND schedule_date = xyz 2.从table2中插入所有记录,其中table2.clinic_code ='ABC'AND table2.schedule_date = xyz into table1。

我想在步骤2中进行更改。
* 2。从table2插入所有记录,其中table2.clinic_code ='ABC'AND 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... 

表名,并附加列已经离开了,如果这将是有帮助的,我可以把列的确切数目。

+0

但是你没有使用table1插入行,只是table2和table3。你不是说你不想插入table2.col3 = 2的行吗? – Lamak 2011-03-10 20:47:38

+0

不。表1和表2非常相似(但不完全),我也不重复,所以如果Table1.col3 = 2中有一行,我不希望插入该行,其余的是。希望有帮助,谢谢! – russds 2011-03-10 21:24:15

+0

我必须说这没有任何意义。你的例子正确吗?如果在table1中有一行col3等于值2,则根本不会执行任何插入操作,因为它总是有一行,其中table1 col3为2.是否存在关于t1.col1 = t2.col1和/或t1.col2 = t3.col2(如你在这里的商业密钥)? – cairnz 2011-03-10 22:35:04

我不确定我是否完全遵循,因为如果您将行插入到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就是你从中拉出来。如果我忽略了这一点,请告诉我,但那应该这样做。

编辑 - 因为你说的表1和表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... 
LEFT OUTER JOIN table1 t1 ON tl.colX = table2.colX 
WHERE table1.col3 <> 2 

的想法是,你现在已经在你的SELECT中包含了table1,并且也可以将它包含在你的WHERE子句中。 (原谅我,如果混叠语法关闭其他SQL口味,我主要是在T-SQL的经验。)

+0

不完全是,因为table1已经有记录。与表2类似。所以我想要插入记录,而不是那些有table1.col3 = 2的记录。在这些记录中,行应该在table1中保持不变。 – russds 2011-03-10 22:18:10

+0

这对于通用列名称以及以AND等结尾的连接来说有点困难......我的想法是在table1和table2之间进行某种连接,然后您可以使用它们根据table1.col3排除不想要的行值为2. table1和table2究竟有什么相似之处?他们之间是否有任何外键关系? – Zannjaminderson 2011-03-10 22:40:08

+0

谢谢Zannjaminderson,我认为你正在做点什么。桌上的PK由col1和col2组成。我有问题,如果使col3的主键的一部分,然后它被插入,我有同一行2,一个col3 = 2和一个col3 = 1。如果我按原样保留PK,则会发生错误冲突,即具有相同PK的另一行试图插入。我怎么能通过这个?它轻声地杀了我。 :) – russds 2011-03-10 23:26:07

嗯,我不知道哪个SQL您正在使用所以这里是一个标准的SQL脚本的更多信息:

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

使用MS SQL 2005.我尝试了上述,但是然后没有插入来自table2的其他记录。 (table1和table2非常相似。)谢谢! – russds 2011-03-10 22:41:07