Sql 将2个表与条件合并
我有一项任务,要将所有表插入到下一个带有条件的表中。我需要像ABONTEAS表主键ABONTEOID一样合并相同的值,其中miestoID为1。我尝试了函数合并,但在内部联接后出现错误。我已经搜索了很多关于它的信息,但我找不到解决方案 错误 关键字“WHEN”附近的语法不正确 密码 下面是我编写合并的方法。 需要在VipAbonentai_源中返回以下列。我不确定他们来自哪个桌子。我写这篇声明是作为一个例子 如果将其包装在中,则可以在上运行它,而不会影响任何记录。此外,我还输出了记录,以查看会发生什么变化。如果表上有触发器,则必须注释掉该行Sql 将2个表与条件合并,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一项任务,要将所有表插入到下一个带有条件的表中。我需要像ABONTEAS表主键ABONTEOID一样合并相同的值,其中miestoID为1。我尝试了函数合并,但在内部联接后出现错误。我已经搜索了很多关于它的信息,但我找不到解决方案 错误 关键字“WHEN”附近的语法不正确 密码 下面是我编写合并的方法。 需要在VipAbonentai_源中返回以下列。我不确定他们来自哪个桌子。我写这篇声明是作为一个例子 如果将其包装在中,则可以在上运行它,而不会影响任何记录。此外,我还输出了记录,以查看会发
您需要在派生表和when matched子句之间使用联接条件。您能详细解释一下吗?合并到使用ON when matched。。。您必须将派生表连接到dbo.VipAbonentai。这里有一个。我不会用合并来更新。只需使用update语句。此外,您正在引用别名ab,但该别名在您的查询中不存在。以及许多其他语法错误。
MERGE dbo.VipAbonentai vip
USING (SELECT ab.abonentoID From Abonentas as ab
Inner join Asmuo as A on ab.asmensID = A.asmensID
Inner join Miestas as M on M.miestoID = M.miestoID
Where M.miestoID = 1)
WHEN MATCHED
THEN UPDATE SET
vip.abonentoID = ab.abonentoID,
WHEN NOT MATCHED BY TARGET
THEN
INSERT (AbonentoID, asmensID, planoID, numeris, sutartiesPradzia,
sutartiesPabaiga)
VALUES (ab.AbonentoID, ab.asmensID, ab.planoID, ab.numeris,
ab.sutartiesPradzia, ab.SutartiesPabaiga) ;
ab.[abonentoID]
, [asmensID]
, [planoID]
, [numeris]
, [sutartiesPradzia]
, [sutartiesPabaiga]
SET XACT_ABORT ON;
BEGIN TRANSACTION;
WITH
VipAbonentai_source
AS
(
SELECT
ab.[abonentoID]
, [asmensID]
, [planoID]
, [numeris]
, [sutartiesPradzia]
, [sutartiesPabaiga]
FROM
Abonentas AS ab
INNER JOIN Asmuo AS A ON ab.[asmensID] = A.[asmensID]
INNER JOIN Miestas AS M ON M.[miestoID] = M.[miestoID]
WHERE
M.[miestoID] = 1
)
MERGE dbo.VipAbonentai AS T
USING VipAbonentai_source AS S
ON T.[abonentoID] = S.[abonentoID]
WHEN NOT MATCHED BY TARGET
THEN INSERT
(
[abonentoID], [asmensID], [planoID], [numeris], [sutartiesPradzia], [sutartiesPabaiga]
)
VALUES
(
S.[abonentoID], S.[asmensID], S.[planoID], S.[numeris], S.[sutartiesPradzia], S.[sutartiesPabaiga]
)
WHEN MATCHED
THEN UPDATE SET
T.[asmensID] = S.[asmensID]
, T.[planoID] = S.[planoID]
, T.[numeris] = S.[numeris]
, T.[sutartiesPradzia] = S.[sutartiesPradzia]
, T.[sutartiesPabaiga] = S.[sutartiesPabaiga]
--WHEN NOT MATCHED BY SOURCE --< You may want to add a WHERE clause here
--THEN DELETE
OUTPUT @@SERVERNAME AS [Server Name], DB_NAME() AS [Database Name], $action, inserted.*, deleted.*;
ROLLBACK TRANSACTION;
--COMMIT TRANSACTION;
GO