SQL Server 2005或LINQ查询:连接两个表并计算字段

时间:2013-08-30 15:56:43

标签: sql linq sql-server-2005

我有两个结构相同的表: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)?

3 个答案:

答案 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
相关问题