一尘不染

在插入时找出表中的重复行

sql

我有一个像下面的桌子

ID   Value
----------
1    A
2    B
3    C
3    C
4    A
4    D
5    A
5    C
5    D

我想要一个查询或存储过程,如果我尝试插入相同类型的值组合,它将识别是否已经存在一个组合。例如:如果我要插入

6   A
6   D

让我知道ID 4已经存在相同的组合。在MSSQL中是否可能?

很少有评论:当我尝试插入新值时,Id将是新的,因此我们无法在表上搜索具有ID,值组合的重复行。我需要一种方法来搜索具有相同id值组合的重复值。

在上面的示例中,当我尝试插入

6   A
6   D

它将在表中搜索是否存在上表中具有相同ID的A和D的任何行,并且存在ID 4,因此当我尝试插入时,应该让我知道有重复的条目这。


阅读 145

收藏
2021-03-17

共1个答案

一尘不染

这将为您提供来自@T的ID,这些ID已具有@NewValues中提供的值的组合。

declare @T table (ID int, Value char(1))
insert into @T values
(1,    'A'),(2,    'B'),(3,    'C'),(3,    'C'),
(4,    'A'),(4,    'D'),(5,    'A'),(5,    'C'),
(5,    'D')

declare @NewValues table(ID int, Value char(1))
insert into @NewValues values (6,    'A'), (6,    'D')

select T.ID
from @T as T
  inner join @NewValues as N
    on T.Value = N.Value
group by T.ID
having count(*) = (select count(*) from @NewValues)

结果:

ID
4
5

如果您只需要完全匹配,则因为ID行中还有一行值=’C’,所以不会返回ID = 5,您可以改用它。

select T.ID
from @T as T
  left outer join @NewValues as N
    on T.Value = N.Value
group by T.ID
having count(N.Value) = (select count(*) from @NewValues) and 
       count(*) = (select count(*) from @NewValues)

我看到您的表中有(3,’C’)和(3,’C’)。如果要使用输入(6,’C’)和(6,’C’)进行检测,则需要此查询。

select T.ID
from @T as T
  left outer join (select distinct Value
                   from @NewValues) as N
    on T.Value = N.Value
group by T.ID
having count(N.Value) = (select count(*) from @NewValues) and 
       count(*) = (select count(*) from @NewValues)

填写`@NewValues?带有字符串拆分功能的表。

-- Paramenter to SP
declare @ParamID int = 6
declare @ParamValues varchar(100) = 'A,D'

declare @NewValues table(ID int, Value char(1))
insert into @NewValues
select @ParamID, s
from dbo.Split(',', @ParamValues)
2021-03-17