【问题标题】:Check for existing row before doing insert在插入之前检查现有行
【发布时间】:2011-07-13 01:08:50
【问题描述】:

Table1 列:

clinic_code、schedule_date、schedule_time、source_id

Table2 列:

诊所代码、日程安排日期、日程安排时间

有一个存储过程可以做到:
1.删​​除表1中clinic_code='ABC' AND schedule_date=xyz的所有记录 2. 将 table2 中 table2.clinic_code='ABC' AND table2.schedule_date=xyz 的所有记录插入到 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...

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

【问题讨论】:

  • 但是你没有使用table1插入行,只是table2和table3。你不是说你不想在 table2.col3 = 2 的地方插入行吗?
  • 没有。 Table1 和 table2 非常相似(但不完全一样)并且我不重复,所以如果 Table1.col3=2 中有一行,我不希望插入该行,其余的是。希望对您有所帮助,谢谢!
  • 我必须说这没有任何意义。你的例子正确吗?如果您在 table1 中有一行 col3 等于值 2,则根本不会进行任何插入,因为它将始终有一行 table1 col3 为 2。关于 t1.col1 = t2.col1 和/或t1.col2 = t3.col2(这里的业务密钥是什么)?
  • 谢谢 cairnz,我会用我认为会有所帮助的表格的更多详细信息来更新问题。

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


【解决方案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

您现在已经将 table1 包含在您的 SELECT 中,因此也可以将它包含在您的 WHERE 子句中。 (如果别名语法不适用于其他 SQL 风格,请原谅我,我主要在 T-SQL 方面有经验。)

【讨论】:

  • 不完全是,因为 table1 中已经有记录。记录类似于表2。所以我想要插入的记录,而不是那些有 table1.col3 = 2 的记录。在这些记录上,table1 中的行应该保持不变。
  • 这对于通用列名和以 AND 等结尾的连接有点困难......我的想法是 table1 和 table2 之间的某种连接,然后你可以使用它来排除你没有的行不希望基于值为 2 的 table1.col3。table1 和 table2 之间到底有什么相似之处?他们之间有外键关系吗?
  • 感谢 Zannjaminderson,我认为您正在做某事。桌上的PK由col1和col2组成。我的问题是,如果将 col3 设为主键的一部分,那么它会被插入,并且我有 2 个同一行,一个 col3=2,一个 col3=1。如果我保持 PK 不变,则会出现错误冲突,即尝试插入具有相同 PK 的另一行。我怎样才能度过难关?它正在温柔地杀死我。 :)
  • where 子句非常有帮助。这样,我就能够将 table1 带入 select 并在 where 子句中使用它。谢谢!
【解决方案2】:

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

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

【讨论】:

  • 使用 MS SQL 2005。我尝试了上述方法,但没有插入 table2 中的其他记录。 (table1 和 table2 非常相似。)谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 2023-04-02
  • 2015-12-04
  • 1970-01-01
  • 2021-01-20
  • 2021-04-05
  • 2018-11-05
相关资源
最近更新 更多