SQL-在连接相关记录时从另一个表更新列?

SQL-在连接相关记录时从另一个表更新列?,sql,sql-server,database,Sql,Sql Server,Database,使用SQL,我将如何更新1个表上的列,并使用找到的所有记录将相关/联接表中的数据连接在一起?我希望将字段连接在一起,并将其用于更新,而不仅仅是基于特定记录对其进行更新 表1 ID|Col1|Col2 1|Hello|Hello2 2|HelloHello|HelloHello2 表2 ParentID|Tbl2Col1|Tbl2Col2 1|Value1|Value2 1|Value1|Value2 1|Value1|Value2 2|Value2|Value3 我想根据Table2.Par

使用SQL,我将如何更新1个表上的列,并使用找到的所有记录将相关/联接表中的数据连接在一起?我希望将字段连接在一起,并将其用于更新,而不仅仅是基于特定记录对其进行更新

表1

ID|Col1|Col2
1|Hello|Hello2
2|HelloHello|HelloHello2
表2

ParentID|Tbl2Col1|Tbl2Col2
1|Value1|Value2
1|Value1|Value2
1|Value1|Value2
2|Value2|Value3
我想根据Table2.ParentID=Table1.ID将表1,ID 1,Col2值更新为所有表2 Tbl2Col2子记录的串联值

因此,完成后,表1将如下所示:

ID|Col1|Col2
1|Hello|Value2, Value2, Value2
2|HelloHello|HelloHello2
ID1,Col2现在设置为表2 Tbl2Col2列中的每个值

更新日期:2/17/20 我试图通过构建这个,但在更新语句中遇到了麻烦。我能够构建SELECT查询,但在执行更新时收到一个错误:当子查询没有引入EXISTS时,SELECT列表中只能指定一个表达式

它实际上也有点复杂,我需要有事件。日志描述最终看起来像:Journal.CreatedDateTime+“\n”Journal.Description

基本上,组合每个相关日志记录的CreatedDateTime和描述,并更新Incident.JournalDescriptions字段

以下是我尝试过的表结构和查询:

CREATE TABLE Incident
    ([RecID] varchar(42), [JournalDescriptions] varchar(max))
;
CREATE TABLE Journal
    ([ParentRecID] varchar(42), [Description] varchar(max), [CreatedDateTime] datetime)
;

INSERT INTO Incident
    ([RecID], [JournalDescriptions])
VALUES
    ('1', ''),
    ('2', '')
;

INSERT INTO Journal
    ([ParentRecID], [Description], [CreatedDateTime])
VALUES
    ('1', 'My Journal Description 1', Getdate()+1),
    ('1', 'My Journal Description 2', Getdate()+2),
    ('2', 'My Journal Description 3', Getdate()+3)
;

-- UPDATE STATEMENT ERRORS: Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.
UPDATE Incident
SET JournalDescriptions = (SELECT
  I.RecID,
  I.JournalDescriptions,
  STRING_AGG(J.Description, '<br />') RegDates,
  STRING_AGG(J.CreatedDateTime, '<br />') WaitListDates
FROM
  Incident AS I
  JOIN Journal AS J
  ON I.RecID = J.ParentRecID
GROUP BY I.RecID, I.JournalDescriptions);
WHERE Incident.RecID = '1'

-- SELECT STATEMENT WORKS
SELECT
  I.RecID,
  I.JournalDescriptions,
  STRING_AGG(J.Description, '<br />') RegDates,
  STRING_AGG(J.CreatedDateTime, '<br />') WaitListDates
FROM
  Incident AS I
  JOIN Journal AS J
  ON I.RecID = J.ParentRecID
GROUP BY I.RecID, I.JournalDescriptions
更新日期2/17/20

当我在两个内部/外部子句中指定RecID时,我能够使这个更新查询仅适用于一行

UPDATE Incident
SET JournalDescriptions = (SELECT
 STRING_AGG(J.Description + CONVERT(varchar, J.CreatedDateTime), '<br />') AS Updated
FROM
  Incident AS I
  JOIN Journal AS J
  ON I.RecID = J.ParentRecID and I.RecID = '1'
GROUP BY I.RecID)
WHERE Incident.RecID = '1';

SELECT RecID,JournalDescriptions FROM Incident;

您需要在数据库中进行某种字符串连接,但其想法是:

update table1
    set col2 = (select string_agg(t2.Tbl2Col2, ',')
                from table2 t2
                where t2.ParentId = table1.id
               );

谢谢大家的帮助/指导

实际的解决办法是:

UPDATE TOP (1000)
       Incident
SET
       AllJournals = STUFF((
    SELECT 'Created: ' + CONVERT(varchar, CreatedDateTime) + CHAR(13) + CHAR(10) + 'Description: ' + Description + CHAR(13) + CHAR(10)
              FROM Journal
              WHERE ParentRecID = RecID
              ORDER BY CreatedDateTime ASC
              FOR XML PATH, TYPE).value(N'.[1]', N'nvarchar(max)'), 1, 0, ''),
       Archived = 1
FROM
       Incident I
WHERE
       CreatedDateTime BETWEEN @Start_Date and @End_Date AND
       Archived != 1
       AND NOT EXISTS (
              SELECT NULL
              FROM ArchiveDB.dbo.Incident I2
              WHERE I2.RecID = I.RecID
       );

此代码将根据RecID列匹配合并来自相关日记账表的数据。它还仅在更新尚未发生时执行更新。

了解您的数据库会很有用,根据您使用的引擎,有不同的方式编写查询。在Oracle Listag中,在mysql组_CONCAT上……ID2 Col2在最终结果表中不是值3吗?根据您的描述。使用您正在使用的数据库标记您的问题。谢谢,我更新了标记以反映Microsoft SQL。谢谢Gordon,我将尝试一下,看看是否可以使其正常工作。实际上,我收到了一个错误,即string_agg不可用。正在运行SQL Server 2014。错误:string_agg不是公认的内置函数我仍在努力寻找一个在SQL 2014中有效的解决方案,然而,在2017年的混乱中,我能够让SELECT正常工作,但实际上没有更新。我刚刚更新了我的原始问题,使用Gordon提供的string_add示例包含了一个更好的表示例。这段代码几乎可以工作,它将所有描述组合在一起,而不是将日期放在相关描述附近,这正是我的意图。选择STRING_AGGJ.Description,+STRING_AGGJ.CreatedDateTime,从事件中更新,因为我在I.RecID=J.ParentRecID组中以J的身份加入日志,由I.RecIDMy最新示例/OP中的更新显示它正在为单个记录工作/更新,RecID='1'-尽管我无法为所有记录运行它。。。