Sql server 2008 基于联接替换字符的SQL查询

Sql server 2008 基于联接替换字符的SQL查询,sql-server-2008,Sql Server 2008,我有一个名为service entry的表,其中有一个名为part description的字段,示例数据如下: **dbo.ServiceEntry** ID PartDescription 1200 60009 ~ Slide Error ~ L 0 ~ P 0 | 60011 ~ RV loader - Pick/Place Homing Error ~ L 0 ~ P 0 然后我有一个名为ServiceEntryPart的表,它有一个1对多关系,一个服务条目中可以有多个部

我有一个名为service entry的表,其中有一个名为part description的字段,示例数据如下:

**dbo.ServiceEntry**
ID      PartDescription
1200  60009 ~ Slide Error ~ L 0 ~ P 0 | 60011 ~ RV loader - Pick/Place Homing Error ~ L 0 ~ P 0 
然后我有一个名为ServiceEntryPart的表,它有一个1对多关系,一个服务条目中可以有多个部分,因此是ServiceEntryPart表

**dbo.ServiceEntryPart**
ID  ServiceEntry   PartID   OldPartID
1    1200          5000     60009
2    1200          5500     60011


**dbo.Part**
ID     Description                           OldPartID
5000   New Slide Description                 60009
5500   Xyz                                   60011
我正在尝试编写一个脚本来更新ServiceEntry表中的partdescription列,这样新的部件id的预期结果如下所示。因此,基本上只是用新的部件id替换旧的部件id

旧产量

新产量

我需要有关script.query的帮助,以使用新零件id(如果存在)更新此字段:

 1. Get the existing field
 DECLARE @PartDescription VARCHAR(8000)
 SELECT @PartDescription =  PartDescription FROM
 ServiceEntry

 2. UPDATE ServiceEntry
    SET PartDescription

如果您可以这样选择:

SELECT SE.ID, SE.PartDescription
FROM ServiceEntryPart SEP
JOIN ServiceEntry SE ON SE.ID = SEP.ServiceEntry
JOIN Part P ON P.ID = SEP.PartID
UPDATE SE
SET SE.PartDescription = P.Description
FROM ServiceEntryPart SEP
JOIN ServiceEntry SE ON SE.ID = SEP.ServiceEntry
JOIN Part P ON P.ID = SEP.PartID
您应该可以这样更新:

SELECT SE.ID, SE.PartDescription
FROM ServiceEntryPart SEP
JOIN ServiceEntry SE ON SE.ID = SEP.ServiceEntry
JOIN Part P ON P.ID = SEP.PartID
UPDATE SE
SET SE.PartDescription = P.Description
FROM ServiceEntryPart SEP
JOIN ServiceEntry SE ON SE.ID = SEP.ServiceEntry
JOIN Part P ON P.ID = SEP.PartID
但是检查你的记录是否正确


ServiceEntry中连接的PartDescription在我看来有问题。您最好在需要时使用规范化表上的联接将这些信息拉到一起,而不是以非规范化形式存储。您将无法以这种形式使用它。

为什么要创建一对多的关系来扭转并取消数据的标准化?这不是我的要求。零件说明连接列用于在页面上显示。我知道规范化,如果您看到我有一个服务条目部分表的话。此时,我无法更改应用程序代码,该列的此更新只会在应用程序而不是数据库中发生连接时发生。然而,我知道,在某些时候,进行这些更改变得更加困难。我只是想让你知道,这是一个有问题的设计,可能会出现的问题之一,就是你现在遇到的问题我同意,我当然没有设计这个表,而且有很多C代码,如果我要规范化这个列,我将无法满足我的最后期限。如果我被要求经常用新的部件更新这个专栏,那么我肯定会正常化,但现在我只想更新那个专栏,因为它从一开始就是一个糟糕的设计,这就是为什么我在这里向你的专家寻求一些帮助。部件描述连接列是为了显示在页面上。服务entr部件表已规范化。在这一点上,我的要求是只更新该列,即使该设计是由某个人为您的答案做的。所以假设这是旧的,我只想回复ID和零件描述,之后的任何内容都会保持不变。1057~试剂盒~1,2~ed | 1094~RV~1,2,3~dqw。因此,在这种情况下,id和部分描述将只替换为新的id和部分描述,这是您不能用新值重建整个字符串的原因吗?我可以重建旧字符串,但在sql中有这个“~l0~p0 |”,并不是每个部分都有。我想我没有正确地解释这个问题。你的回答对我来说是一条好路,我很快就会把它标为正确的
DECLARE @ServiceEntry TABLE(
        ID INT,
        PARTDescription VARCHAR(MAX)
)

DECLARE @ServiceEntryPart TABLE(
        ID   INT,
        ServiceEntry   INT,
        PartID INT,
        OldPartID INT
)

DECLARE @Part TABLE(
        ID  INT,
        [Description]  VARCHAR(50),
        OldPartID VARCHAR(50)
)

INSERT INTO @ServiceEntry SELECT 1200, ''

INSERT INTO @ServiceEntryPart SELECT 1, 1200, 5000, 60009
INSERT INTO @ServiceEntryPart SELECT 2, 1200, 5500, 60011

INSERT INTO @Part SELECT 5000, 'New Slide Description', 60009
INSERT INTO @Part SELECT 5500, 'Xyz', 60011

UPDATE @ServiceEntry
SET PARTDescription = 
        ( 
            SELECT  CAST(p.ID AS VARCHAR)+ ' ~ ' + p.Description + ' ~ L 0 ~ P 0 | '
            FROM    @Part p INNER JOIN  
                    @ServiceEntryPart ep ON p.ID = ep.PartID
            WHERE   ep.ServiceEntry = se.ID
            FOR XML PATH('')
        ) 
FROM    @ServiceEntry se

UPDATE @ServiceEntry
SET PARTDescription = LEFT(PARTDescription, LEN(PARTDescription) -2)

SELECT *
FROM @ServiceEntry