![](/img/trans.png)
[英]SQL Server 2008 Compare two different database tables for column name, data type and length
[英]SQL Server 2008 compare two tables in same database and get column is changed
我需要得到兩個表之間的區別。 我需要比較兩個表中的“產品”,“數量”和“價格”列,並說出它的新記錄還是我需要提及更改哪個列值。
示例表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
您可以使用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;
當然,這不是最簡潔的方法,但是可讀性強並且可能有效:
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
如果需要排序結果,則必須在外部查詢中執行此操作,例如here 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.