删除表“A”中的行,其中“A”中的列“1”值与表“B”中的列“1”值匹配,但“B”中的列“2”值不存在于“B”中

时间:2017-02-07 14:58:49

标签: sql database postgresql

对于令人困惑的标题感到抱歉,我认为我的问题有点难以言喻。我有两个表,我们称之为“A”和“B”,它们各有很多列。为简单起见,假设它们只有列“1”和“2”。

现在,对于有趣的部分,我想编写一个SQL查询,对表A的第1列中的每个数值进行检查,以查看表A的第2列的值是否存在于表B的第2列中第1列的值。如果表B中的那些值不存在,则删除表A中的该行。

例如,每个表中第1行的值是其他地方使用的对象的ID。当我按照每个表中的特定ID进行过滤时,我看到表A中的行数比我想要的多,差异是第2列,这是一个相关的日期。当我过滤该ID时,我想删除与A中的日期相关的额外行,而不是B中的日期。

我不能像这里使用的那样使用NOT IN或NULL语句: Delete sql rows where IDs do not have a match from another table 或者在这里: Delete from table if the id doesn't exists in another table 因为每个表的每一列中的某些值确实存在于另一个表的某个位置,而不是相应的过滤器。

这是我第一次在SE上提问,我尽力解释,但如果我能提供任何其他信息,请告诉我!谢谢!

1 个答案:

答案 0 :(得分:1)

据我所知,如果另一个表中没有相应的值,您希望从一个表中删除。强烈建议not exists(无论数据库如何)。

我最好能解析你的描述:

delete from a
    where not exists (select 1
                      from b
                      where b.col1 = a.col1 and b.col2 = a.col2
                     );