更新表有2个连接

时间:2016-07-07 12:53:59

标签: sql sql-server

我需要更新引用另外两个表的表。

这是我的选择代码,用于验证哪些行将被更新。

Intent i = new Intent(Intent.ACTION_SEND);
i.setType("message/rfc822");
i.putExtra(Intent.EXTRA_EMAIL  , new String[]{"jainharshil670@yahoo.in"});
i.putExtra(Intent.EXTRA_SUBJECT, "subject of email");
i.putExtra(Intent.EXTRA_TEXT   , "body of email");
try {
 startActivity(Intent.createChooser(i, "Send mail"));
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(MyActivity.this, "There are no email applications installed.", Toast.LENGTH_SHORT).show();
}

enter image description here

这是我加入的3个表格的结果。列'div'来自表div,它取决于ro_no,而'bpn,s_num,created_by'来自表temp_db。

现在我想从我的选择代码更新所有选定的行。这是我的更新代码。

SELECT  *
FROM    txsh AS t1 
        INNER JOIN div AS t2 ON t2.store = t1.ro_no
        INNER JOIN temp_db AS t3 ON t3.bpn = t1.sku_id
                   AND (t3.div IS NULL OR t3.div = t2.div)
                   AND (t3.s_num IS NULL OR t3.s_num = t1.ro_no)

我有三个更新实例。它取决于temp_db(bpn,s_num,div)

  1. 如果s_num和div为null,则更新txsh,其中sku_id = bpn
  2. 如果s_num不为null且div为null,则更新txsh,其中sku_id = bpn和ro_no = s_num
  3. 如果s_num为null且div不为null,则更新txsh,其中sku_id = bpn,[ro_no]的div div [t2]的div值等于temp_db的[div]值。
  4. 我认为错误是在实例上[3]。有没有办法纠正我的where子句,例如[3]?

1 个答案:

答案 0 :(得分:2)

好的,这对谈话来说太长了,所以我会把它换成答案......

这是您的原始查询,稍加重新格式化以便于阅读:

SELECT  
    t1.*
FROM    
    txsh t1 
    INNER JOIN div t2 ON t2.store = t1.ro_no
    INNER JOIN temp_db t3 ON t3.bpn = t1.sku_id 
        AND ISNULL(t3.div, t2.div) = t2.div 
        AND ISNULL(t3.s_num, t1.ro_no) = t1.ro_no;

如果运行该查询,它将返回一定数量的行,它可能返回txsh中的每一行,或者它可能返回行的子集,因为有两个约束(INNER JOIN条件)。

然后,这些INNER JOIN可能会带来来自txsh的多条记录的复杂性,因此行数最终可能会高于txsh中的行数。例如,div中可能有10行,其中store = 10,而txsh中有一行,其中ro_no = 10(我不知道你的数据,也许这是不可能的?)。在这种情况下,对于store = 10的每一行数据,您可以从txsh获得10个重复行。

所以我的第一个问题是,此查询返回了多少行,这是预期的结果吗?理想情况下,您没有重复问题,答案是查询返回介于零和txsh中的行数之间。

您的更新查询现在应该像以下一样简单:

UPDATE
    t1
SET
    price = '0'
FROM    
    txsh t1 
    INNER JOIN div t2 ON t2.store = t1.ro_no
    INNER JOIN temp_db t3 ON t3.bpn = t1.sku_id 
        AND ISNULL(t3.div, t2.div) = t2.div 
        AND ISNULL(t3.s_num, t1.ro_no) = t1.ro_no;

当你运行它时,它会告诉你有多少行被更新,这是否与SELECT查询返回的行数相同?

如果你能回答这两个问题,我们可以继续解决这个问题吗?

好的,我仍然有点怀疑SELECT查询返回7行而UPDATE更新了10行......但是让我们尝试这个作为起点。我只是尽可能简单地写出你的逻辑。如果这样可行,那么我们可能会稍微重构一下这个查询吗?

UPDATE
    t1
SET
    price = '0'
FROM    
    txsh t1 
    INNER JOIN div t2 ON t2.store = t1.ro_no
    INNER JOIN temp_db t3 ON t3.bpn = t1.sku_id 
WHERE
    --Case 1
    (t3.div IS NULL AND t3.s_num IS NULL)
    --Case 2
    OR (t3.div IS NULL AND t3.s_num IS NOT NULL AND t3.s_num = t1.ro_no)
    --Case 3
    OR (t3.div IS NOT NULL AND t3.s_num IS NULL AND t3.div = t2.div);

所以INNER JOIN到temp_db现在只是bbp到sku_id,因为这在你的三种情况下是不变的。我将每个案例的其余逻辑添加到WHERE子句中。

我会首先尝试将其作为SELECT查询运行,然后尝试UPDATE?