2015-11-30 102 views
0

我有兩個表,我需要比較數據並更新一個表記錄。請讓我知道如何做到這一點。這是該方案使用拆分比較在兩個表之間合併數據

Proj1表 這是需要將數據同步的第一臺

ID Text   reqId 
1 R1|R2   12    
2 R2|R3   12 
3 R3|R5|R2  12 

Proj2表 這是數據更新正在發生

ID Text Active reqId 
    3 R1 1  12 
    4 R3 1  12 
    5 R4 1  12 

我需要從Proj1中獲取每條記錄,然後對拆分中的每個文本使用拆分函數,比較文本字段這兩個表之間的結果應該與下面類似。我們正在將Proj2中的數據同步到Proj1。

ID Text Active reqId 
    3 R1 1  12 (Ignore as it exists in both tables) 
    4 R3 1  12 (Ignore as it exists in both tables) 
    5 R4 0  12 (Update to inactive as it does not exist Proj1 table but exists in) 
    6 R2 1  12 (Insert as it does not exist in Proj2 table, insert only once) 
    7 R5 1  12 (Insert as it does not exist in Proj2 table, insert only once) 

回答

0

如果您使用的是SQL Server 2008或更高版本,你可以使用MERGE聲明,就像這樣:

/* 
CREATE TABLE Proj1 (
    ID INT PRIMARY KEY, 
    Text VARCHAR(100) NOT NULL, 
    reqId INT NOT NULL 
) 

INSERT INTO Proj1 VALUES (1,'R1|R2',12) 
INSERT INTO Proj1 VALUES (2,'R2|R3',12) 
INSERT INTO Proj1 VALUES (3,'R3|R5|R2',12) 

CREATE TABLE Proj2 (
    ID INT IDENTITY PRIMARY KEY, 
    Text VARCHAR(100) NOT NULL, 
    Active BIT NOT NULL, 
    reqId INT NOT NULL 
) 

SET IDENTITY_INSERT Proj2 ON 
INSERT INTO Proj2 (ID, Text, Active, reqId) VALUES (3,'R1',1,12) 
INSERT INTO Proj2 (ID, Text, Active, reqId) VALUES (4,'R3',1,12) 
INSERT INTO Proj2 (ID, Text, Active, reqId) VALUES (5,'R4',1,12) 
SET IDENTITY_INSERT Proj2 OFF 
*/ 
GO 
CREATE FUNCTION dbo.Split(@String VARCHAR(1000),@Separator CHAR(1)) 
RETURNS @Result TABLE (
    Position INT IDENTITY PRIMARY KEY, 
    Value VARCHAR(1000) 
) AS 
BEGIN 
    DECLARE @Pos INT, @Prev INT 
    SET @Prev=0 
    WHILE 1=1 BEGIN 
     SET @Pos=CHARINDEX(@Separator,@String,@Prev+1) 
     IF @Pos=0 BREAK 
     INSERT INTO @Result (Value) VALUES (SUBSTRING(@String,@Prev+1,@[email protected])) 
     SET @[email protected] 
    END 
    INSERT INTO @Result (Value) VALUES (SUBSTRING(@String,@Prev+1,LEN(@String))) 
    RETURN 
END 
GO 

MERGE INTO dbo.Proj2 p2 
USING (
    SELECT DISTINCT reqId, Value FROM dbo.Proj1 p1 
    CROSS APPLY dbo.Split(Text,'|') s 
) x 
ON p2.Text=x.Value AND p2.reqId=x.reqId 
WHEN NOT MATCHED THEN INSERT VALUES (Value,1,reqid) 
WHEN NOT MATCHED BY SOURCE THEN UPDATE SET Active=0 
WHEN MATCHED AND Active=0 THEN UPDATE SET Active=1; 

SELECT * FROM dbo.Proj2 

後來編輯:我增加了三分之一,這時候在MERGE語句條款,來處理行已經存在但沒有激活標誌的情況(儘管這種情況不會出現在樣本數據中)。

+0

感謝您的回覆,我們可以做到這一點沒有合併。我需要得到一些使用文本值的ID查找合併可能不適合我的需要。 – user3038399

0

您也可以處理這沒有MERGE語句,就像這樣:

INSERT INTO Proj2 
SELECT Value,1,reqid 
FROM (
    SELECT DISTINCT reqId, Value FROM dbo.Proj1 p1 
    CROSS APPLY dbo.Split(Text,'|') s 
) x 
WHERE NOT EXISTS (
    SELECT * 
    FROM Proj2 p2 
    WHERE p2.Text=x.Value AND p2.reqId=x.reqId 
) 

UPDATE Proj2 SET Active=0 
FROM Proj2 p2 
WHERE NOT EXISTS (
    SELECT * 
    FROM (
     SELECT DISTINCT reqId, Value FROM dbo.Proj1 p1 
     CROSS APPLY dbo.Split(Text,'|') s 
    ) x 
    WHERE p2.Text=x.Value AND p2.reqId=x.reqId 
) 

UPDATE Proj2 SET Active=1 
FROM Proj2 p2 
INNER JOIN (
    SELECT DISTINCT reqId, Value FROM dbo.Proj1 p1 
    CROSS APPLY dbo.Split(Text,'|') s 
) x ON p2.Text=x.Value AND p2.reqId=x.reqId 
WHERE p2.Active=0 

(我曾經在其他的答案中提到的Split函數)

+0

欣賞你的回覆,再有一個查詢。 R1,R2,R3存儲在帶ID的其他表中。當插入proj2我需要得到該ID我怎麼能做到這一點。 ID文本 31 R1 42 R3 55 R4 – user3038399

+0

使用JOIN(請參閱http://www.w3schools.com/sql/sql_join.asp)。 –