MERGE INTO [GROUP_MEMBER] AS A
USING @MEMBER_TABLE AS B
ON (A.[CUSTOMER_ID]=B.[CUSTOMER_ID] AND A.[GROUP_ID]=@GROUP_ID)
WHEN NOT MATCHED 
THEN INSERT([CUSTOMER_ID],[GROUP_ID]) VALUES(B.[CUSTOMER_ID],@GROUP_ID)
WHEN NOT MATCHED BY SOURCE
THEN DELETE;
同步两个表的时候 @GROUP_ID是组ID,@MEMBER_TABLE是客户ID表,CUSTOMER_ID是客户ID  
我想把[GROUP_MEMBER]和@MEMBER_TABLE表的数据同步
但这样写似乎A.[GROUP_ID]=@GROUP_ID没有起到作用
也就是并没有按 组ID来匹配 请问要如何解决

解决方案 »

  1.   

    NAME         GNAME
    ZS           分组1
    LS           分组1 
    WW           分组1
    ZS           分组2
    LS           分组2
    ZS           分组3
    WW           分组3这样的数据怎么查询成 
    ZS    分组1,分组2,分组3
    LS    分组1,分组2
    WW    分组1,分组3
      

  2.   

    /*
    工单号    操作者
    a1       张三
    a1       王二 
    a1       李四现在要得到查询结果:
    工单号    操作者
    a1       张三、王二、李四
    */IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[test1]') AND type in (N'U'))
    DROP TABLE [dbo].[test1]
    GOCREATE TABLE [dbo].[test1](
    工单号 [varchar](10) NOT NULL,
    操作者 [varchar](10) NOT NULL
    ) ON [PRIMARY]GOINSERT [test1]
    VALUES ('a1','张三'),('a1','王二'),('a1','李四')select 工单号,
    操作者=stuff((select '、'+操作者
            from test1
           where 工单号=t.工单号
            for xml path('')),1,1,'')
    from test1 t
    group by 工单号DECLARE @s VARCHAR(4000)
    SELECT @s=@s +'、'+操作者 from test1 WHERE 工单号='a1'
    PRINT @s
    SET @s=STUFF(@s,1,1,'')
    EXEC('select 工单号,'+@s+' FROM test1')
      

  3.   

    /*
    工单号    操作者
    a1       张三
    a1       王二 
    a1       李四现在要得到查询结果:
    工单号    操作者
    a1       张三、王二、李四
    */IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[test1]') AND type in (N'U'))
    DROP TABLE [dbo].[test1]
    GOCREATE TABLE [dbo].[test1](
    工单号 [varchar](10) NOT NULL,
    操作者 [varchar](10) NOT NULL
    ) ON [PRIMARY]GOINSERT [test1]
    VALUES ('a1','张三'),('a1','王二'),('a1','李四')select 工单号,
    操作者=stuff((select '、'+操作者
            from test1
           where 工单号=t.工单号
            for xml path('')),1,1,'')
    from test1 t
    group by 工单号DECLARE @s VARCHAR(4000)
    SELECT @s=@s +'、'+操作者 from test1 WHERE 工单号='a1'
    PRINT @s
    SET @s=STUFF(@s,1,1,'')
    EXEC('select 工单号,'+@s+' FROM test1')请问下这样查询能对GROUP_NAME 使用ISNULL吗
      

  4.   


    create table a3
    (NAME varchar(10), GNAME varchar(10))insert into a3
     select 'ZS', '分组1' union all
     select 'LS', '分组1' union all
     select 'WW', '分组1' union all
     select 'ZS', '分组2' union all
     select 'LS', '分组2' union all
     select 'ZS', '分组3' union all
     select 'WW', '分组3'
     select a.NAME,
           stuff((select ','+isnull(b.GNAME,'') from a3 b
                  where b.name=a.NAME for xml path('')),1,1,'') 'GNAME'
     from a3 a
     group by a.NAME
     order by a.NAME desc/*
    NAME       GNAME
    ---------- ------------------------
    ZS         分组1,分组2,分组3
    WW         分组1,分组3
    LS         分组1,分组2(3 row(s) affected)
    */
      

  5.   

    用触发器里的inserted表获取多条数据,然后逐条处理..
      

  6.   

    IF OBJECT_ID('GROUP_MEMBER','u') IS NOT NULL
    DROP TABLE [GROUP_MEMBER]
    CREATE TABLE [GROUP_MEMBER] ([GROUP_ID] int, [CUSTOMER_ID] int)
    INSERT [GROUP_MEMBER] SELECT 1, 10 UNION ALL SELECT 1, 11 UNION ALL SELECT 2, 999
    --sql:
    DECLARE @GROUP_ID INT 
    SET @GROUP_ID = 1
    DECLARE @MEMBER_TABLE TABLE([CUSTOMER_ID] int)
    INSERT @MEMBER_TABLE SELECT 11 UNION ALL SELECT 12
    --data:
    SELECT * FROM [GROUP_MEMBER]
    SELECT * FROM @MEMBER_TABLEMERGE INTO [GROUP_MEMBER] AS A
    USING @MEMBER_TABLE AS B ON 

    A.[CUSTOMER_ID] = B.[CUSTOMER_ID]
    AND A.[GROUP_ID] = @GROUP_ID --起作用了,ON后面的条件相当于做个INNER JOIN+ON中的条件。此时能匹配上的只有group_id:1,customer_id:11
    )
    WHEN NOT MATCHED THEN --@member_table中有而group_member表中没有的记录,会插入到group_member表,即@group_id:1,customer_id:12
    INSERT 
    (
    [CUSTOMER_ID] ,
    [GROUP_ID]
    )
    VALUES    
    (
    B.[CUSTOMER_ID] ,
    @GROUP_ID
    )
    WHEN NOT MATCHED BY SOURCE --group_member表中有而@member_table表中没有的记录,会直接删除,即group_id:1,customer_id:10和group_id:2,customer_id:999
    THEN DELETE;--result:所以结果就是:group_member表插入了1条记录,删除了2条记录; @member_table表的记录不会变
    SELECT * FROM [GROUP_MEMBER]
    SELECT * FROM @MEMBER_TABLE
      

  7.   

    --对于触发器,是这样的:
    --1个SQL执行1次会触发1次触发器
    --当INSERT一条记录时,INSERTED表中会存储一条记录,当INSERT多条记录时,INSERTED表中会存储多条记录
    --所以写触发时,应该考虑到同时更新多条记录的情况
    CREATE TRIGGER tr_test ON [GROUP_MEMBER]
    AFTER INSERT
    AS
    BEGIN
    SELECT * FROM INSERTED --这个表中可能会是多条记录
    END