首页 > 解决方案 > 如何在行上添加或更新数据但不会重复具有两个相同值的同一行的项目

问题描述

在此处输入图像描述

我想在我要添加或更新组的 sql 命令中寻求帮助。哪里有条件。

  1. 组只能有 3 种不同的类型。
  2. 如果该组上的类型尚未使用,则人员可以更改他的类型或组名
  3. 如果新人尚不存在于桌子上,则添加新人,但如果他或她选择了已使用的组中的类型,则不会添加。
  4. 如果他或她创建新组,则会添加新人。

我遇到的问题是如何检查组中的类型是否已被使用。我在下面添加了我的查询。

如果您有问题或更正,我很乐意解决。谢谢!

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

标签: sqlsql-servertsql

解决方案


您有 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

推荐阅读