SQL Query根据连接替换字符

时间:2013-02-12 16:59:03

标签: sql-server-2008

我有一个名为service entry的表,它有一个名为part description的字段,Sample数据如下:

**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对多的关系,一个服务条目可以包含多个部分,因此服务条目部分表

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

OLD OUTPUT

60009 ~ Slide Error ~ L 0 ~ P 0 | 60011 ~ RV loader - Pick/Place Homing Error ~ L 0 ~ P 0

新输出

5000 ~ New Slide Description ~ L 0 ~ P 0 | 5500 ~ Xyz ~ L 0 ~ P 0

我需要一些有关script.query的帮助,用新的部件ID(如果存在)更新此字段:

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

 2. UPDATE ServiceEntry
    SET PartDescription

2 个答案:

答案 0 :(得分:0)

如果您可以这样选择:

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对我来说很有问题。您可能最好在需要时使用规范化表上的连接将这些信息拉到一起,而不是以非规范化形式存储它们。你将无法用这种形式做很多事情。

答案 1 :(得分:0)

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