Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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 server 比较和合并具有相同结构的两个表中的数据_Sql Server_Tsql_Sql Server 2014 - Fatal编程技术网

Sql server 比较和合并具有相同结构的两个表中的数据

Sql server 比较和合并具有相同结构的两个表中的数据,sql-server,tsql,sql-server-2014,Sql Server,Tsql,Sql Server 2014,如果有两个具有相同结构的表(如下所示),是否可以构建一个SQL语句来比较id为唯一键的两个表的列的值,并以以下格式返回更改列的列表: columnname, oldvalue, newvalue 其中,oldvalue是表1中的值,newvalue是表2中的值。您可以这样做: SELECT T1.Id ,'Name' AS ColumnName ,CAST(T1.name AS VARCHAR(MAX)) AS OldValue ,CAST(T2.name

如果有两个具有相同结构的表(如下所示),是否可以构建一个SQL语句来比较id为唯一键的两个表的列的值,并以以下格式返回更改列的列表:

columnname, oldvalue, newvalue

其中,oldvalue是表1中的值,newvalue是表2中的值。

您可以这样做:

SELECT T1.Id
      ,'Name' AS ColumnName
      ,CAST(T1.name AS VARCHAR(MAX)) AS OldValue
      ,CAST(T2.name AS VARCHAR(MAX)) AS NewValue
FROM Table1 AS T1
FULL OUTER JOIN Table2 AS T2
  ON T1.id = T2.id
UNION
SELECT T1.Id
      ,'Amount'
      ,CAST(T1.amount AS VARCHAR(MAX))
      ,CAST(T2.amount AS VARCHAR(MAX))
FROM Table1 AS T1
FULL OUTER JOIN Table2 AS T2
  ON T1.id = T2.id

您需要使用合并语句,请注意,它仅在SQL 2008之后可用

这里有一个例子

MERGE Production.ProductInventory AS target
USING (SELECT ProductID, SUM(OrderQty) FROM Sales.SalesOrderDetail AS sod
    JOIN Sales.SalesOrderHeader AS soh
    ON sod.SalesOrderID = soh.SalesOrderID
    AND soh.OrderDate = @OrderDate
    GROUP BY ProductID) AS source (ProductID, OrderQty)
ON (target.ProductID = source.ProductID)
WHEN MATCHED AND target.Quantity - source.OrderQty <= 0
    THEN DELETE
WHEN MATCHED 
    THEN UPDATE SET target.Quantity = target.Quantity - source.OrderQty, 
                    target.ModifiedDate = GETDATE()
OUTPUT $action, Inserted.ProductID, Inserted.Quantity, Inserted.ModifiedDate, Deleted.ProductID,
    Deleted.Quantity, Deleted.ModifiedDate;
GO

如果您只想要有差异的行,您可以在此处了解有关合并的更多信息

SELECT COALESCE(T1.Id, T2.Id) Id
      ,'Name' AS ColumnName
      ,CAST(T1.name AS VARCHAR(MAX)) AS OldValue
      ,CAST(T2.name AS VARCHAR(MAX)) AS NewValue
FROM Table1 AS T1
FULL OUTER JOIN Table2 AS T2
  ON T1.id = T2.id 
WHERE COALESCE(T1.name,'**') != COALESCE(T2.name ,'**')
UNION ALL
SELECT COALESCE(T1.Id, T2.Id) Id
      ,'Amount' AS ColumnName
      ,CAST(T1.Amount AS VARCHAR(MAX)) AS OldValue
      ,CAST(T2.Amount AS VARCHAR(MAX)) AS NewValue
FROM Table1 AS T1
FULL OUTER JOIN Table2 AS T2
  ON T1.id = T2.id 
WHERE COALESCE(T1.Amount,0) != COALESCE(T2.Amount,0)

提示:使用适当的软件MySQL、Oracle、DB2等标记数据库问题是很有帮助的。。。和版本,例如sql-server-2014。语法和功能的差异常常会影响答案。这是什么?这不会产生所需的输出,甚至不会使用提供的表模式。