SQL单元格不包含特定字符集时插入行

问题描述 投票:0回答:5

我的数据库有一个名为Group的列。

这个Group可以是两个值之一:

  1. Group101 =主要群体
  2. Group101D1 =小组

每个组都有两个这样的选项。

enter image description here

但我有一些Group101D1存在的情况,但Group101没有。

现在我想创建一个插入,我在其中搜索没有主组的D1组。例如,我有Group105D1但没有Group105。我想要一个插件来创建一个Group105行。

就我而言:

INSERT INTO (Group)
    SELECT [Table1].[Group], [Table2].[Group]
    FROM [Table] Table1
    INNER JOIN [Table] Table2 ON [table1].[Group] = [Table2].[Group]
    -- WHERE [Table2].[Group] LIKE '%D1'
    --   AND [Table1].[Group] NOT LIKE '%D1'

你们有些人可以帮忙,我不知道怎么做到这一点。

我知道我可能需要使用内连接,替换和where where子句。

sql sql-server tsql
5个回答
0
投票

您将需要replace此外,查询应排除已存在的行

样本数据:

 DECLARE @groups TABLE ([Group] VARCHAR(100), description VARCHAR(100))

INSERT @groups ([Group], description)
SELECT 'Group101', 'Something1'

UNION ALL

SELECT 'Group101d1', 'Something1'

UNION ALL

SELECT 'Group105d1', 'description_Bleh'

UNION ALL

SELECT 'Group2054', 'desc_2054'

UNION ALL

SELECT 'Group2054d1', 'desc_2054'

使用替换函数并排除Maingroup(如果存在)

SELECT Replace([group], 'd1', '') [Group], description
FROM @groups
WHERE [Group] NOT IN (
        SELECT p.[Group]
        FROM @groups g
        INNER JOIN @groups p
            ON g.[Group] = replace(p.[Group], 'd1', '')
        )

结果:

Group         description
Group105    description_Bleh

0
投票

如果所有子组以“D1”结尾,则可以使用以下查询来插入缺少的主要组。

INSERT INTO (Group)
SELECT
left(subtable.Group,(len(subtable.Group)-len('D1')))
FROM
[Table1].[Group] subtable
where 
charindex (  'D1', subtable.Group) > 0 -- if it is sub-record
and
 not exists --check if main group exists
  (SELECT
1
FROM
[Table1].[Group] main
where (charindex (    main.Group+'D1', subtable.Group) != 0)   
)

0
投票

您刚刚打包过数据的东西

DECLARE @groups TABLE (grp VARCHAR(100), description VARCHAR(100));
INSERT @groups (grp, description) values 
         ('Group101', 'Something1')
       , ('Group101d1', 'Something1')
       , ('Group105d1', 'description_Bleh')
       , ('Group106d1', 'description_Bleh6')
       , ('Group2054', 'desc_2054')
       , ('Group2054d1', 'desc_2054');
select * from @groups order by grp; 
insert into @groups
select replace(g1.grp, 'd1', ''), g1.description 
  from @groups g1
 where g1.grp like '%d1' 
   and not exists ( select 1 
                    from @groups g2 
                    where g2.Grp = replace(g1.grp, 'd1', '') 
                  );
select * from @groups order by grp;

0
投票

你可以使用NOT EXISTSREPLACE来获得如下所需的结果:

INSERT INTO Table2(Group)
 select  replace([Group], 'd1', '') from Table1 a
 where [Group] like '%d1' and 
 not exists(
     select 1 from Table1 where [group] = replace(a.[Group], 'd1', '')
     )  

0
投票

我最终这样做了!

insert into Table (Group, Description)
select  replace(Group,'D1','') , description from Table
where Group like '%D1'
and replace(Group,'D1','') not in (
select Group from Table
where Group like 'Group%' and Group not like '%D1')
© www.soinside.com 2019 - 2024. All rights reserved.