Merge two tables / concatenate values into single column

后端 未结 3 1179
执笔经年
执笔经年 2021-01-01 07:46

I have two tables: table A holds master product data, and table B holds children product data. I would like to update table A to hold the same value of the identical column

相关标签:
3条回答
  • 2021-01-01 08:08

    See the answers to this question:

    how-to-return-multiple-values-in-one-column

    0 讨论(0)
  • 2021-01-01 08:26

    I think this will do it:

    SELECT parent_id AS ID, 
      STUFF((
        SELECT ','+color FROM TableB a WHERE a.parent_id = b.parent_id FOR XML PATH('')
      ),1,1,'') AS color,
      STUFF((
        SELECT ','+Location FROM TableB a WHERE a.parent_id = b.parent_id FOR XML PATH('')
      ),1,1,'') AS Location,
    FROM TableB b
    GROUP BY parent_id
    
    0 讨论(0)
  • 2021-01-01 08:31

    Check this...

    IF OBJECT_ID('TableA') IS NOT NULL DROP TABLE TableA
    IF OBJECT_ID('TableB') IS NOT NULL DROP TABLE TableB
    CREATE TABLE TableA (ID  INT,  Color  VARCHAR(max), Location VARCHAR(max), Class VARCHAR(max))
    CREATE TABLE TableB (child_ID  INT,  parent_ID INT,  Color  VARCHAR(10), Location VARCHAR(10), Class VARCHAR(10))
    INSERT INTO TableB 
          SELECT 1,1,'white','house'  ,'I' UNION SELECT 2,2,'red'  ,'garage' ,'II'
    UNION SELECT 3,2,'white','garage' ,'I' UNION SELECT 4,3,'blue' ,'house'  ,'IV'
    UNION SELECT 5,3,'blue' ,'garage' ,'I' UNION SELECT 6,3,'white','garage' ,'I'
    UNION SELECT 7,3,'gray' ,'garage' ,'I' UNION SELECT 8,2,'gray' ,'house'  ,'IV'
    
    SELECT * FROM TableB
    
    DECLARE @cmd VARCHAR(max);
    SET @cmd = 'INSERT INTO TableA SELECT ID = b.parent_id '
    SELECT @cmd = @cmd + ' , ['+COLUMN_NAME+'] = STUFF(
                (   SELECT '', '' +'+COLUMN_NAME+' 
                    FROM TableB 
                    WHERE parent_id = b.parent_id
                    GROUP BY '+COLUMN_NAME+' 
                    FOR XML PATH('''') 
                ) , 1, 2, '''' )'
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME='TableB' AND COLUMN_NAME NOT IN ('child_ID', 'parent_id')
    
    SELECT @cmd = @cmd + ' FROM TableB AS b GROUP BY b.parent_id'
    
    EXEC(@cmd)
    SELECT * FROM TableA
    
    /* -- OUTPUT
      ID | Color             | Location      | Class
      ---------------------------------------------------
      1  | white             | house         | I
      2  | gray, red, white  | garage, house | I, II, IV
      3  | blue, gray, white | garage, house | I, IV
    */
    
    0 讨论(0)
提交回复
热议问题