2017-05-03 64 views
0

示例表。下表有沒有主鍵(只有外國人):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-AY的行和具有1-1-BY的行

我不想說「從...刪除其中col1 = 1和col2 = 1,col3 = A和col4 = Y「等。如果這很容易,我不會在這裏問。

它必須通過差異評估工作。

我使用用戶定義的表類型(代表陣列),其中我認爲應該保持,然後所有值試了一下簡單的調用delete from .. where [value] not in (select s from @my_array)

它的工作原理一列,但只要有一秒鐘,它(顯然)失敗。 爲什麼?因爲在上面的例子中,在第一列和第二列中存在SAME值,並且一旦它們相等,語句「不在」是假的。

有沒有人有關於如何做到這一點的建議?

+0

約從表S其中不存在'刪除哪個(SELECT * FROM @my_array一個地方s.col1 = a.col1 AND s.col2 = a.col2 AND s.col3 = a.col3 AND s.col4 = a.col4'? – juharr

+0

感謝您的建議,但問題是,這樣所有其他行都會被刪除如果它們不在數組中 –

+0

我認爲你想刪除所有不在數組中的行,所以喲你想刪除一些不在數組中的行,你不刪除哪些行? – juharr

回答

0

如果您使用SQL Server作爲數據庫,也許可以使用MERGE語句。

它可以讓你根據比賽做一些動作或不兩個型動物源(表,select語句,...)

Here是從微軟的官方文章的行之間的匹配。

希望它能幫助!

+0

我會研究它,謝謝! –

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); 
+0

如果它們具有空單元格,則該行不會完全消失 –