【问题标题】:SQL Server 2008 compare two tables in same database and get column is changedSQL Server 2008 比较同一数据库中的两个表并更改获取列
【发布时间】:2013-12-04 17:14:34
【问题描述】:

我需要了解两个表之间的差异。 我需要比较两个表中的产品、数量和价格列,并说明它是否是新记录,或者我需要提及更改了哪个列的值。

示例表 A

Product | Qty | Price | Comments

A          20    500     xyz
B          50    200     xyz
C          90    100     abc

示例表 B

Product | Qty | Price | Comments

A          20    500     sd
B          70    200     cv
C          90    200     wsd
D          50    500     xyz

目前我正在使用 Expect 提供所有新的/不匹配的行。

select Product,Qty,Price 
from TableB 
except 
select Product,Qty,Price 
from TableA

Product | Qty | Price 
B          70    200   
C          90    200   
D          50    500   

但我需要如下结果集

Product |  Result

B          Updated Qty
C          Updated Price
D          New

【问题讨论】:

  • 如果更新了不止一列,结果会怎样?
  • @GarethD 感谢您的评论。如果更新了不止一列,我需要提及所有更新的列名。例如更新数量、价格

标签: sql sql-server sql-server-2008 join


【解决方案1】:

您可以使用LEFT JOIN

SELECT  b.Product,
        b.Qty,
        b.Price,
        Result = CASE WHEN a.product IS NULL THEN 'New'
                    ELSE 'Updated: ' + 
                        STUFF(  CASE WHEN a.Qty != b.Qty THEN ',Qty' ELSE '' END + 
                                CASE WHEN a.Price != b.Price THEN ',Price' ELSE '' END,
                            1, 1, '')
                END
FROM    TableB b    
        LEFT JOIN TableA a
            ON a.Product = b.Product
WHERE   a.Product IS NULL
OR      a.Qty != b.Qty
OR      a.Price != b.Price;

Example on SQL Fiddle

【讨论】:

  • 太完美了!!谢谢
【解决方案2】:

肯定不是最简洁的方法,但可读且可能有效:

SELECT B.Product,
       Result = 'Updated Qty'
FROM TableB B 
LEFT OUTER JOIN TableA A
    ON B.Product = A.Product 
WHERE A.Product IS NOT NULL 
AND A.Qty <> B.Qty
AND A.Price = B.Price

UNION ALL

SELECT B.Product,
       Result = 'Updated Price'
FROM TableB B 
LEFT OUTER JOIN TableA A
    ON B.Product = A.Product 
WHERE A.Product IS NOT NULL 
AND A.Price <> B.Price
AND A.Qty = B.Qty

UNION ALL

SELECT B.Product,
       Result = 'Updated Qty and Price'
FROM TableB B 
LEFT OUTER JOIN TableA A
    ON B.Product = A.Product 
WHERE A.Product IS NOT NULL 
AND A.Price <> B.Price
AND A.Qty <> B.Qty

UNION ALL

SELECT B.Product,
       Result = 'New'
FROM TableB B 
LEFT OUTER JOIN TableA A
    ON B.Product = A.Product 
WHERE A.Product IS NULL

Demo

如果您需要对结果进行排序,则必须在 here 等外部查询中进行。

【讨论】:

    猜你喜欢
    • 2013-07-18
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多