Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将2个表与条件合并_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 将2个表与条件合并

Sql 将2个表与条件合并,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一项任务,要将所有表插入到下一个带有条件的表中。我需要像ABONTEAS表主键ABONTEOID一样合并相同的值,其中miestoID为1。我尝试了函数合并,但在内部联接后出现错误。我已经搜索了很多关于它的信息,但我找不到解决方案 错误 关键字“WHEN”附近的语法不正确 密码 下面是我编写合并的方法。 需要在VipAbonentai_源中返回以下列。我不确定他们来自哪个桌子。我写这篇声明是作为一个例子 如果将其包装在中,则可以在上运行它,而不会影响任何记录。此外,我还输出了记录,以查看会发

我有一项任务,要将所有表插入到下一个带有条件的表中。我需要像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