我有两个结构相同的表:Table1
(原始)和Table2
(已更新)
我必须保留Table1
的所有数据而不做任何更改。
Table2
可以包含来自Table1
的1行或所有行,但相同的信息除了一列QUANTITY
之外可能与原始列不同。
我想要一个查询,我们将这两个表连接起来,结果显示Table1
中的所有行,但如果在Table2
中存在匹配项,请显示Table2
中的行,从Table1
中丢弃该行,并显示列QUANTITY
的总和或减去。
示例:
表1
Product Quantity
Shirt 3
Pants 5
Shoes 9
表2
Product Quantity
Pants 2
结果:
Product Quantity
---------------
Shirt 3
Pants 3
Shoes 9
这可能来自一个查询,还是应该使用额外的代码(我使用的是C#和LINQ)?
答案 0 :(得分:1)
var query = from table1 in data.Table1s
join table2 in data.Table2s
on table1.ID equals table2.ID
into x
select new {
table1.Shirt,
Pants = x.Sum(c=>c.Pants) + table1.Pants,
table1.Shoes
};
答案 1 :(得分:0)
这一切都取决于你的表布局,我建议在你的表中有一个Active标志,这样你就不会从table1中删除记录,而只是将它设置为非活动状态。然后你可以使用Case Statement来完成你想要的。
因此,使用数据类型bit向表1(IsActive)添加列时,请使用以下查询:
DECLARE @tResult TABLE
(ProductName varchar(max),
ProductQTY int,
ToSetInactive int)
INSERT INTO @tResult
Select
ProductName,
CASE WHEN tbl1.ProductName = tbl2.ProductName THEN DO YOUR LOGIC HERE ELSE DO SOME OTHER LOGIC HERE END AS QTY,
ProductName,
CASE WHEN tbl1.ProductName = tbl2.ProductName THEN tbl1.Id ELSE 0 END AS ToSetAsInactive
From Table1 tbl1
INNER JOIN Table2 tbl2 on tbl2.ProductName = tbl2.ProductName
UPDATE TABLE1 set IsActive WHERE ID in (select ToSetInactive from @tResult)
Select * From @Result
希望这有帮助
答案 2 :(得分:0)
select table1.product, isnull(table1.quantity - table2.quantity, table1.quantity) as Quantity
from table1
left join table2
on table1.product = table2.product