我需要更新引用另外两个表的表。
这是我的选择代码,用于验证哪些行将被更新。
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();
}
这是我加入的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)
我认为错误是在实例上[3]。有没有办法纠正我的where子句,例如[3]?
答案 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?