使用内部联接和子查询更新表

时间:2012-10-02 22:09:03

标签: tsql subquery

我在网上搜索过但无法提出解决方案。我感谢任何帮助。

我有一张包含这些值的表格。

Item Charge No  Item Ledger Entry No    IsReceivedInFull
--------------------------------------------------------
Ocean Freight   1525593
Factory Cost    1525593
Overhead        1525593
Factory Cost    1525593
Fee             1525593
Duty            1525593
Landing Freight 1525593

我正在尝试遍历我的结果以检查每个项目分类帐条目否我在表格中有这五个组件; '海运','工厂成本','费用','责任'和'着陆运费'。如果单个项目分类帐输入编号至少有五行,每个上面提到的项目费用编号为一行,那么我想将“IsReceivedInFull”设置为“是”

我来自ABAP编程背景,并且知道这可以通过几个LOOP语句轻松完成,但我是T-SQL的新手并且很难解决这个简单的问题。请帮忙。

1 个答案:

答案 0 :(得分:0)

你可以试试这个:

UPDATE mytable tgt
SET    tgt.isreceivedinfull="Yes"
WHERE  tgt.isreceivedinfull is null and
       exists(SELECT src.item_ledger_Entry_no, count(*) 
              FROM   mytable src
              WHERE  src.item_ledger_entry_no = tgt.item_ledger_entry_no  
                     and src.item_charge_no in ("Ocean Freight", 
                                                "Factory Cost", 
                                                "Fee", 
                                                "Duty", 
                                                "Landing Freight")
                    group by src.item_ledger_entry_no
                    having count(*) >= 5)

您可能必须根据您的数据库类型和字段名称广告表名称调整字符串文字(“或”),因为它们不适用于您的示例。

这应该有效。

有关说明:如果子选择的结果是非空记录集(意味着多于一行),则存在条件将为真。通过在子选择的where子句中使用tgt.item_ledger_entry_no,如果此特定项目包含您要查找的5个条目,则只会获得非null。 说到这一点,它还会为所有具有相同ID的行设置“是”,但不在列表中的一个行(名为“Overhead”)。而且因为你有重复的行(名为“工厂成本”有两次),所以条件设置为大于或等于。

希望有所帮助

丹尼尔