我有一个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存储过程也对我有用。
答案 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)
用户可以将CTE
与Row_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可能是明智的做法,这样您就不会阻止其他用户发布合法数据。