【发布时间】:2017-05-03 22:00:38
【问题描述】:
示例表。下表没有主键(只有外键):
col1 col2 col3 col4
1 1 A X
1 1 A Y
1 1 B Y
1 1 A -
1 1 - -
1 2 A X
1 2 A Y
1 2 B -
1 2 A -
1 2 - -
现在有一个具有完全相同值的列表 - 但其中一个或多个缺失。 例如带有 1-1-A-Y 的行和带有 1-1-B-Y 的行
我不想说“从 .. 中删除 col1=1 和 col2=1 和 col3=A 和 col4=Y”等等。 如果这么简单,我就不会在这里问了。
它必须通过差异评估。
我尝试使用用户定义的表类型(表示数组),其中我保存所有应该保留的值,然后简单地调用delete from .. where [value] not in (select s from @my_array)
它适用于 ONE 列,但一旦有第二列,它(显然)就会失败。 为什么?因为在上面的例子中,第一列和第二列有相同的值,一旦相等,“不在”的陈述就是假的。
有人对如何完成此任务有建议吗?
【问题讨论】:
-
delete from table s where not exists(select * from @my_array a where s.col1 = a.col1 AND s.col2 = a.col2 AND s.col3 = a.col3 AND s.col4 = a.col4呢? -
感谢您的建议,但问题是,如果它们不在数组中,那么所有其他行也会被删除。
-
我以为你想删除所有不在数组中的行。所以你要删除一些不在数组中的行,哪些不删除?