Sql 合并两个表/将值连接到单个列中

Sql 合并两个表/将值连接到单个列中,sql,sql-server-2008,Sql,Sql Server 2008,我有两个表:表A保存主产品数据,表B保存子产品数据。我想更新表A,使其在只有一个不同值的情况下保持表B中相同列的相同值。如果distinct count大于1,我想用逗号连接这些列。除键列名外,这些表具有相同的列 是否可以编写动态SQL来匹配所有列并处理合并/连接 示例如下: 表A ID | color | Location ____| ______|_____________ 1 | | 2 | | 3 | | 4 | |

我有两个表:表A保存主产品数据,表B保存子产品数据。我想更新表A,使其在只有一个不同值的情况下保持表B中相同列的相同值。如果distinct count大于1,我想用逗号连接这些列。除键列名外,这些表具有相同的列

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

示例如下:

表A

ID | color | Location ____| ______|_____________ 1 | | 2 | | 3 | | 4 | | ID |颜色|位置 ____| ______|_____________ 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 子ID |父ID |颜色|位置 __________|___________|________|_________ 1 | 1 |白宫 2 | 2 |红色|车库 3 | 2 |白色|车库 4 | 3 |蓝|屋 表A将类似于:

ID | color | Location ____| ___________|_____________ 1 | white | house 2 | red, white | garage 3 | white | house ID |颜色|位置 ____| ___________|_____________ 1 |白宫 2 |红、白|车库 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

我认为这样可以做到:

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

请参见此问题的答案:


请参见此问题的答案:

检查此

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
*/
检查这个

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
*/

是否有理由在一个字段中存储多个值?这将使搜索特定记录的速度稍慢。这只是为了导出而保持数据平面的要求。是否有理由在一个字段中存储多个值?它会使搜索特定记录的速度稍慢。只是为了导出而保持数据平面的要求..将在每列的基础上工作,但我需要它是动态的,以便对所有列进行工作。将在每列的基础上工作,但我需要它是动态的,才能对所有列进行操作。同样,这也可以,但我需要它是动态的,才能对表中的所有列进行操作。@chipShot-通过提供一个sql脚本,该脚本可以实际用于创建示例表,并基于这些表提供预期的输出,从而简化那些试图帮助您的人的工作。我想我能帮上忙,但我不想把时间花在一个我没有完全理解的问题上。这同样可行,但我需要它是动态的,以便处理表中的所有列。@chipShot-通过提供一个sql脚本来简化那些试图帮助您的人的工作,该脚本实际上可以用于创建示例表并提供预期的基于输出的结果在那些桌子上。我想我能帮上忙,但我不想把时间花在一个我不完全理解的问题上。谢谢你的帮助。我希望这对以后的其他人有帮助。谢谢你的帮助。我希望这对将来的其他人有帮助。