sql - 如何在行上添加或更新数据但不会重复具有两个相同值的同一行的项目
问题描述
我想在我要添加或更新组的 sql 命令中寻求帮助。哪里有条件。
- 组只能有 3 种不同的类型。
- 如果该组上的类型尚未使用,则人员可以更改他的类型或组名
- 如果新人尚不存在于桌子上,则添加新人,但如果他或她选择了已使用的组中的类型,则不会添加。
- 如果他或她创建新组,则会添加新人。
我遇到的问题是如何检查组中的类型是否已被使用。我在下面添加了我的查询。
如果您有问题或更正,我很乐意解决。谢谢!
ID Type GroupName Name
-------------------------------
00 1 GROUPA John
01 2 GROUPA Jane
02 3 GROUPA Ted
03 1 GROUPB Rose
04 2 GROUPB Eric
05 3 GROUPB Nico
IF NOT EXISTS(SELECT * FROM TABLEA as ATG WHERE @ID = ATG.ID)
BEGIN
INSERT INTO TABLEA(ID,TYPE,GroupName,Name)
VALUES (@ID,@TYPE,@GroupName,@Name)
END
ELSE
BEGIN
UPDATE TABLEA SET [ID] = @ID,[TYPE] = @TYPE ,[GroupName]=@GroupName, [Name]= @Name
WHERE ID = @ID
END
解决方案
您有 2 个不同的测试,您需要考虑 4 个可能的结果。我用 PRINT 语句标记了“没有做”输出,但您必须“将输出设置为文本”才能看到它。
--Test with each of the casews below. Make sure to "Set output to Text" to see the PRINT statements
DECLARE @ID int = 1; DECLARE @GType INT = 3; DECLARE @GName varchar(50) = 'GROUPB'; DECLARE @UName varchar(50) = 'Jane'; --Jane tries to move to taken group (3-B is taken by Nico)
--DECLARE @ID int = 1; DECLARE @GType INT = 3; DECLARE @GName varchar(50) = 'GROUPC'; DECLARE @UName varchar(50) = 'Jane'; --Jane tries to move to free group (3-C)
--DECLARE @ID int = 6; DECLARE @GType INT = 3; DECLARE @GName varchar(50) = 'GROUPB'; DECLARE @UName varchar(50) = 'Alice'; --New user tries to enter taken group (3-B is taken by Nico)
--DECLARE @ID int = 6; DECLARE @GType INT = 3; DECLARE @GName varchar(50) = 'GROUPC'; DECLARE @UName varchar(50) = 'Alice'; --New user enters free group (3-C)
DECLARE @TABLEA TABLE (ID Int, GType int, GName nvarchar(50), UName nvarchar(50))
INSERT INTO @TABLEA(ID, GType, GName, UName)
VALUES (0, 1, 'GROUPA', 'John'), (1, 2, 'GROUPA', 'Jane'), (2, 3, 'GROUPA', 'Ted')
, (3, 1, 'GROUPB', 'Rose'), (4, 2, 'GROUPB', 'Eric'), (5, 3, 'GROUPB', 'Nico')
IF EXISTS (SELECT * FROM @TABLEA WHERE ID = @ID) BEGIN --Existing user
--And wants to switch to a free group
IF NOT EXISTS (SELECT * FROM @TABLEA WHERE GType = @GType AND GName = @GName )
--then update them
UPDATE @TABLEA SET GType = @GType, GName = @GName, UName = @UName
WHERE ID = @ID
ELSE
PRINT('Existing user cannot change group/type, that group/type combination is taken')
END ELSE BEGIN--new user, is the Group/Type combo available?
IF NOT EXISTS (SELECT * FROM @TABLEA WHERE GType = @GType AND GName = @GName )
--then INSERT them
INSERT INTO @TABLEA (ID, GType, GName, UName)
VALUES (@ID, @GType, @GName, @UName)
ELSE
PRINT('New user cannot be assigned, that group/type combination is taken')
END
SELECT * FROM @TABLEA
推荐阅读
- node.js - 有没有办法查看我的文件是如何编辑的 - node.JS
- php - 如何在 wordpress 中使用 paginate_links 而不会出现 404 错误?
- python - 如何在每个测试对由 [0 1] 组成的情况下“排除对”
- autodesk-forge - Forge 查看器在 2D 视图中显示模糊的元素,并且 Measure 扩展对它们不起作用
- angular - Ionic - Angular 9:无法消化 Swiper 回调
- python - 用户使用 Flask python 登录后显示注销按钮
- javascript - 道具React发生变化时如何渲染组件?
- python - Jinja 中的变量 - Flask
- xml - 如何使用 xidel 从 XML 中提取数据
- javascript - 使用带有故事书的全局 scss