SQL:从必须满足多个条件的表中删除差异

时间:2017-05-03 12:55:03

标签: c# sql

实施例-表。下表没有主键(只有外键):

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)

它适用于一列,但只要有一秒,它(显然)就会失败。 为什么?因为在上面的示例中,在第一列和第二列中存在SAME值,并且只要它相等,语句"不在"是假的。

有人建议如何实现这个目标吗?

2 个答案:

答案 0 :(得分:0)

如果您使用SQL Server作为数据库,也许您可​​以使用MERGE语句。

它允许您根据两个不同源(表,select语句,...)的行之间的匹配或不匹配来执行某些操作。

Here是微软的官方文章。

希望它可以提供帮助!

答案 1 :(得分:0)

我对你的描述和示例感到困惑,但我可以看到你想删除行,如果它们有空单元格吗?

这是函数:

public static void RemoveNullColumnFromDataTable(DataTable dt, string[] columnName)
{
    for (int i = dt.Rows.Count - 1; i >= 0; i--)
    {
        foreach (string column in columnName)
        {
            if (dt.Rows[i][column] == DBNull.Value)
            {
                dt.Rows[i].Delete();
            }
        }
    }
    dt.AcceptChanges();
}

所以你运行它:

string[] columnsToFilter = {"Col1", "Col2", "Col3", "Col4");
staticClass.RemoveNullColumnFromDataTable(yourDataTable, columnsToFilter);