我有两个表,第一个叫做table1,结构和内容如下所示
+--+-----+------+------+
|ID|fname|Lname |Status|
+--+-----+------+------+
|1 |Pat |Test | |
+--+-----+------+------+
|2 |Su |Test2 | |
+--+-----+------+------+
|3 |Bri |Test4 | |
+--+-----+------+------+
|4 |Mel |Gi | |
+--+-----+------+------+
|5 |Good |Record| |
+--+-----+------+------+
|6 |Tr |BL | |
+--+-----+------+------+
第二个表包含需要提交到table1的更新。
+--+-------+-----+
|ID|Fname |Lname|
+--+-------+-----+
|1 |Patrick|Cool |
+--+-------+-----+
|2 |Susun |Smart|
+--+-------+-----+
|6 |True |Blood|
+--+-------+-----+
我想比较两个表并将table1更新为表2的内容。(使用ID进行比较)如果对任何行进行了任何更新,我希望将状态列标记为UPDATED。如果table1中存在一行,但它在table2中不存在,我希望table1中该行的状态标记为DELETE。没有变化的行应该没有状态
更新后,最终输出应该类似于
+--+-------+------+------+
|ID|fname |Lname |Status|
+--+-------+------+------+
|1 |Patrick|Cool |UPDATE|
+--+-------+------+------+
|2 |Susun |Smart |UPDATE|
+--+-------+------+------+
|3 |Brian |Brown |DELETE|
+--+-------+------+------+
|4 |Mel |Gibson|DELETE|
+--+-------+------+------+
|5 |Good |Record||
+--+-------+------+------+
|6 |True |Blood |UPDATE|
+--+-------+------+------+
任何帮助将不胜感激
答案 0 :(得分:0)
也许尝试嵌套查询? 删除已更新的
UPDATE table_1 SET status = "DELETED" WHERE id NOT IN (
SELECT id FROM table_2
)
更新
UPDATE table_1, table_2
SET table_1.status = "UPDATED",
table_1.fName = table_2.FName,
table_1.lName = table_2.LName
WHERE table_1.id IN (
SELECT id FROM table_1, table_2
WHERE table_1.id = table_2.id AND
(table_1.fName!= table_2.FName OR table_1.lName!=table_2.LName)
)
(已编辑)更新并加入
UPDATE table_1
SET table_1.fName = t2.FName, table_1.lName = t2.LName, table_1.status = "UPDATED"
FROM table_1 AS t1 JOIN table_2 AS t2 USING (id)
WHERE t1.fName!=t2.FName OR t1.lName!=t2.LName
答案 1 :(得分:0)
hashbrown - >
上面的代码只显示“DELETED”,“UPDATED”,对不起(: 所以我会添加这个可以提供帮助的代码
在Simple-talk-> the merge statement in sql server 2008
中了解详情IF OBJECT_ID ('BookInventory', 'U') IS NOT NULL
DROP TABLE dbo.BookInventory;
CREATE TABLE dbo.BookInventory -- target
(
TitleID INT NOT NULL PRIMARY KEY,
Title NVARCHAR(100) NOT NULL,
Quantity INT NOT NULL
CONSTRAINT Quantity_Default_1 DEFAULT 0
);
IF OBJECT_ID ('BookOrder', 'U') IS NOT NULL
DROP TABLE dbo.BookOrder;
CREATE TABLE dbo.BookOrder -- source
(
TitleID INT NOT NULL PRIMARY KEY,
Title NVARCHAR(100) NOT NULL,
Quantity INT NOT NULL
CONSTRAINT Quantity_Default_2 DEFAULT 0
);
INSERT BookInventory VALUES
(1, 'The Catcher in the Rye', 6),
(2, 'Pride and Prejudice', 3),
(3, 'The Great Gatsby', 0),
(5, 'Jane Eyre', 0),
(6, 'Catch 22', 0),
(8, 'Slaughterhouse Five', 4);
INSERT BookOrder VALUES
(1, 'The Catcher in the Rye', 3),
(3, 'The Great Gatsby', 0),
(4, 'Gone with the Wind', 4),
(5, 'Jane Eyre', 5),
(7, 'Age of Innocence', 8);
--1 Implementing the WHEN MATCHED Clause
MERGE BookInventory bi
USING BookOrder bo
ON bi.TitleID = bo.TitleID
WHEN MATCHED THEN
UPDATE
SET bi.Quantity = bi.Quantity + bo.Quantity;
SELECT * FROM BookInventory;
--2 Implementing the WHEN MATCHED Clause (Delete)
MERGE BookInventory bi
USING BookOrder bo
ON bi.TitleID = bo.TitleID
WHEN MATCHED AND
bi.Quantity + bo.Quantity = 0 THEN
DELETE
WHEN MATCHED THEN
UPDATE
SET bi.Quantity = bi.Quantity + bo.Quantity;
SELECT * FROM BookInventory;
--3 Implementing the WHEN NOT MATCHED [BY TARGET] Clause
MERGE BookInventory bi
USING BookOrder bo
ON bi.TitleID = bo.TitleID
WHEN MATCHED AND
bi.Quantity + bo.Quantity = 0 THEN
DELETE
WHEN MATCHED THEN
UPDATE
SET bi.Quantity = bi.Quantity + bo.Quantity
WHEN NOT MATCHED BY TARGET THEN
INSERT (TitleID, Title, Quantity)
VALUES (bo.TitleID, bo.Title,bo.Quantity);
SELECT * FROM BookInventory;
--4 Implementing the WHEN NOT MATCHED BY SOURCE Clause
MERGE BookInventory bi
USING BookOrder bo
ON bi.TitleID = bo.TitleID
WHEN MATCHED AND
bi.Quantity + bo.Quantity = 0 THEN
DELETE
WHEN MATCHED THEN
UPDATE
SET bi.Quantity = bi.Quantity + bo.Quantity
WHEN NOT MATCHED BY TARGET THEN
INSERT (TitleID, Title, Quantity)
VALUES (bo.TitleID, bo.Title,bo.Quantity)
WHEN NOT MATCHED BY SOURCE
AND bi.Quantity = 0 THEN
DELETE;
SELECT * FROM BookInventory;
--5 Implementing the OUTPUT Clause
DECLARE @MergeOutput TABLE
(
ActionType NVARCHAR(10),
DelTitleID INT,
InsTitleID INT,
DelTitle NVARCHAR(50),
InsTitle NVARCHAR(50),
DelQuantity INT,
InsQuantity INT
);
MERGE BookInventory bi
USING BookOrder bo
ON bi.TitleID = bo.TitleID
WHEN MATCHED AND
bi.Quantity + bo.Quantity = 0 THEN
DELETE
WHEN MATCHED THEN
UPDATE
SET bi.Quantity = bi.Quantity + bo.Quantity
WHEN NOT MATCHED BY TARGET THEN
INSERT (TitleID, Title, Quantity)
VALUES (bo.TitleID, bo.Title,bo.Quantity)
WHEN NOT MATCHED BY SOURCE
AND bi.Quantity = 0 THEN
DELETE
OUTPUT
$action,
DELETED.TitleID,
INSERTED.TitleID,
DELETED.Title,
INSERTED.Title,
DELETED.Quantity,
INSERTED.Quantity
INTO @MergeOutput;
SELECT * FROM BookInventory;
SELECT * FROM @MergeOutput
--where ActionType = 'UPDATE'
答案 2 :(得分:-1)
您可以使用合并条款和OUTPUT
IF OBJECT_ID (N'dbo.Purchases', N'U') IS NOT NULL
DROP TABLE dbo.Purchases;
GO
CREATE TABLE dbo.Purchases (
ProductID int, CustomerID int, PurchaseDate datetime,
CONSTRAINT PK_PurchProdID PRIMARY KEY(ProductID,CustomerID));
GO
INSERT INTO dbo.Purchases VALUES(707, 11794, '20060821'),
(707, 15160, '20060825'),(708, 18529, '20060821'),
(711, 11794, '20060821'),(711, 19585, '20060822'),
(712, 14680, '20060825'),(712, 21524, '20060825'),
(712, 19072, '20060821'),(870, 15160, '20060823'),
(870, 11927, '20060824'),(870, 18749, '20060825');
GO
IF OBJECT_ID (N'dbo.FactBuyingHabits', N'U') IS NOT NULL
DROP TABLE dbo.FactBuyingHabits;
GO
CREATE TABLE dbo.FactBuyingHabits (
ProductID int, CustomerID int, LastPurchaseDate datetime,
CONSTRAINT PK_FactProdID PRIMARY KEY(ProductID,CustomerID));
GO
INSERT INTO dbo.FactBuyingHabits VALUES(707, 11794, '20060814'),
(707, 18178, '20060818'),(864, 14114, '20060818'),
(866, 13350, '20060818'),(866, 20201, '20060815'),
(867, 20201, '20060814'),(869, 19893, '20060815'),
(870, 17151, '20060818'),(870, 15160, '20060817'),
(871, 21717, '20060817'),(871, 21163, '20060815'),
(871, 13350, '20060815'),(873, 23381, '20060815');
GO
select * from Purchases;
select * from FactBuyingHabits;
--Now this is the Place where you do the manipulation you want
MERGE dbo.FactBuyingHabits AS Target
USING (SELECT CustomerID, ProductID, PurchaseDate FROM dbo.Purchases) AS Source
ON (Target.ProductID = Source.ProductID AND Target.CustomerID = Source.CustomerID)
WHEN MATCHED THEN
UPDATE SET Target.LastPurchaseDate = Source.PurchaseDate
WHEN NOT MATCHED BY TARGET THEN
INSERT (CustomerID, ProductID, LastPurchaseDate)
VALUES (Source.CustomerID, Source.ProductID, Source.PurchaseDate)
OUTPUT $action, Inserted.ProductId InsertedProductId,
Inserted.CustomerId InsertedCustomerId,
Inserted.LastPurchaseDate InsertedLastPurchaseDate,
Deleted.ProductId DeletedProductId,
Deleted.CustomerId DeletedCustomerId,
Deleted.LastPurchaseDate DeletedLastPurchaseDate;
select * from FactBuyingHabits;
drop table FactBuyingHabits;
drop table Purchases;