2011-05-18 58 views
1

我有两个表:表A包含主产品数据,表B包含子产品数据。我想更新表A以保持表B中的相同列的相同值,因为它只有一个不同的值。如果不同的计数大于1,我想用逗号连接列。这些表具有除键列名称以外的相同列。将两个表/连接值合并为单列

是否可以编写动态SQL来匹配所有列并处理合并/连接?

举例如下:

表A

 
ID | color | Location 
____| ______|_____________ 
1 |  | 
2 |  | 
3 |  | 
4 |  | 

表B

 
child_ID | parent_id | Color | Location 
__________|___________|________|_________ 
1   | 1  | white | house 
2   | 2  | red | garage 
3   | 2  | white | garage 
4   | 3  | blue | house 

表A的样子:

 

ID | color | Location 
____| ___________|_____________ 
1 | white  | house 
2 | red, white | garage 
3 | white  | house 
+0

有要将多个值存储在一个领域的原因是什么?它会使搜索特定记录的速度稍慢。 – 2011-05-18 00:17:38

+0

只是要求保持数据平稳出口.. – 2011-05-18 00:22:20

回答

2

入住此...

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

感谢您的帮助。我希望这会在未来帮助别人。 – 2011-05-18 16:59:22

3

我想这会做到这一点:

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

将工作在每列的基础上,但我需要它是动态的,以执行所有列的工作。 – 2011-05-18 03:30:17

1

看到这个问题的答案:

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

+0

再次这将工作,但我需要它是动态的工作在一个表内的所有列。 – 2011-05-18 12:36:53

+0

@chipShot - 尝试通过提供一个实际可用于创建示例表并提供基于这些表的预期输出的sql脚本来缓解那些试图帮助您的人的工作。我想我可以在这里帮忙,但我不想花时间在一个我没有完全理解的问题上。 – leoinfo 2011-05-18 15:33:05