删除重复提交的行

时间:2019-05-07 16:59:02

标签: sql-server stored-procedures duplicates

我有一个Web表单,当用户提交时,数据保存在数据库中(SQL Server 2014)。由于过去缺乏防止双击按钮提交表单的机制,因此生成了重复的行。看下面的示例(表:users):

id name 
1  Jane
2  Jane 
3  Jane
4  Jason
5  John
6  John

在上面,Jane有3行,John有2行。我希望有一个查询来删除重复的行,如果有重复则保留第一行(例如:Jane仅保留第1行,John仅保留第5行)。 SQL存储过程也对我有用。

5 个答案:

答案 0 :(得分:2)

尝试: 首先通过子查询选择正确的ID,然后删除除这些用户外的所有ID。但我认为您也应该防止出现双击问题。

public class MainActivity : AppCompatActivity, View.IOnTouchListener {

    private EditText editText2;

    protected override void OnCreate(Bundle savedInstanceState) {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.main);
        editText2 = FindViewById<EditText>(Resource.Id.editText2);
        editText2.RequestFocus();
        editText2.SetOnTouchListener(this);  // Requires addition of View.IOnTouchListener interface to class
    }

    public bool OnTouch(View v, MotionEvent e) {
        v.OnTouchEvent(e);
        var imm = (Android.Views.InputMethods.InputMethodManager)v.Context.GetSystemService(InputMethodService);
        imm?.HideSoftInputFromWindow(v.WindowToken, Android.Views.InputMethods.HideSoftInputFlags.None);
        return true;
    }
}

答案 1 :(得分:1)

您可以查询每个用户的最小ID,然后删除其他用户:

DELETE FROM mytable
WHERE  id NOT IN (SELECT   MIN(id)
                  FROM     mytable
                  GROUP BY name)

答案 2 :(得分:1)

用户可以将CTERow_Number()配合使用来删除无关的记录

示例

;with cte as (
    Select *
          ,RN = Row_Number() over (Partition By Name Order By ID)
      from YourTable
)
Delete from cte where RN>1

Select * from YourTable

更新后的表格

id  name
1   Jane
4   Jason
5   John

答案 3 :(得分:0)

我假设您那里有一个autoid,并且要插入的不仅仅是一列,如果插入值已经存在,我会尽量避免插入重复项。

INSERT INTO MyTable(x,y,z) 
SELECT 'form field 1','form field 2', 'form field 3'
WHERE NOT EXISTS (select * from MyTable where x='form field 1' and y='form field 2' and z = 'form field 3')

答案 4 :(得分:0)

使用SQL触发器检查记录是否已添加到表中。如果尚未添加,则不执行任何操作。

跟踪提交数据的用户的SessionID可能是明智的做法,这样您就不会阻止其他用户发布合法数据。