基于高级筛选在SQL中删除行

时间:2017-01-06 12:21:52

标签: sql request

我有一个很大的数据库,我需要清理法律原因。虽然我是一名webdev,但在SQL查询方面我还是没有经验。

上下文是一个CRM,其中包含“联系人”,“公司”和“来源”字段。

“source”有4个可能的值:source1,source2,source3和sources4

“source1”应该因法律原因而被删除,因此最初来自source1的欺骗行为。

事实上,有些公司是重复的,并且在从旧数据库导入和重新导入时,最多可以标记3个来源。

这就是它的表现:

**name | company | source**
name1 |  company1 |  source1 *< delete row (rows with source1 must be deleted)* 
name1 |  company1 |  source2 *< delete row (company1 comes from source1)*
name1 |  company1 |  source3 *< delete row (company1 comes from source1)*
name2 |  company2 |  source1 *< delete row (rows with source1 must be deleted)*
name2 |  company2 |  source2 *< delete row (company2 comes from source1)*
name3 |  company3 |  source2 *< keep row (company3 doesn't come from source1)*
name4 |  company4 |  source3 *< keep row*
name5 |  company5 |  source4 *< keep*

我需要做的是:

1-摆脱公司拥有source2的行和带有source1的欺骗行。

2-一旦完成,对具有source2的所有联系人和具有source1的欺骗行为执行相同的操作

我真的不知道SQL请求可以做什么以及我应该使用哪些命令。

甚至可能吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以在WHERE子句中使用子查询,如下所示:

DELETE FROM mytable
  WHERE mytable.company IN (SELECT   mytable.company
                                FROM mytable
                               WHERE mytable.source = 'source1'
                            GROUP BY mytable.company)

另一种选择是使用EXISTS

MySQL解决方法(因为它不允许在WHERE子句中使用被更改的表):

DELETE FROM mytable
  WHERE mytable.company IN (SELECT   mytbl.company
                                FROM (SELECT * FROM myTable) as mytbl
                               WHERE mytbl.source = 'source1'
                            GROUP BY mytbl.company)