在不同的表中设置一列等于另一列



我是相当新的SQL,我正试图创建一个SQL命令检查某物是否等于某物在一个表中,然后更新另一个表中的某物的值。我已经在网上寻找解决方案,但我还不够好,不能确定我所看到的是否可以用来完成我想要完成的任务。

所以这里是我正在使用的表和列的实际名称:

  • 项目(使用"ID")
    • SaleType (int, not null)
  • nitroasl_pamtable(使用"ItemID")
    • PAM_SpecialOffer (bit, not null)

两个表中产品共享的"ID"如下:-"Item"表中的"ID"列- "nitroasl_pamtable"表中的"ItemID"列

我需要做的是遍历"Item"表并找到"SaleType"等于"1"的所有产品-然后通过设置"PAM_SpecialOffer"等于"1"来更新"nitroasl_pamtable"中的这些id。

是以下能够做我想要的(这是一个非常粗略的猜测)?

UPDATE nitroasl_pamtable
SET PAM_SpecialOffer = SaleType
FROM Item
INNER JOIN nitroasl_pamtable
ON ID = ItemID
WHERE SaleType = 1

我希望上面是有意义的,因为我发现它有点难以用语言表达,但简而言之,我试图用"ID"one_answers"ItemID"(分别)在两个不同的表中标记所有"SaleType=1"one_answers"PAM_SpecialOffer=1"的产品。

所以,下面给了我一个我想要更改的集合的列表。身份完全匹配,等等。现在我如何用"1"UPDATE PAM_SpecialOffer列(我如何更改以下代码来做到这一点)?

SELECT i.ID, i.SaleType, i.SaleStartDate, i.SaleEndDate, i.ItemLookupCode, n.ItemID, n.PAM_SpecialOffer
FROM Item AS i
JOIN nitroasl_pamtable AS n
ON i.ID = n.ItemID
WHERE i.SaleType = 1
and (i.SaleStartDate > '2015-01-01' or i.SaleStartDate = '1899-12-31')
and i.SaleEndDate > getdate();

看起来您的语句可以工作。但是,我将把它写成:

UPDATE pt
SET PAM_SpecialOffer = i.SaleType
FROM nitroasl_pamtable pt INNER JOIN
     Item i
     ON i.ID = pt.ItemID
WHERE i.SaleType = 1;

ipt是表别名,是表名的缩写。在某些情况下,它们是必要的。在这里,它们只是澄清了查询正在做什么以及列来自哪里。

作为规则,当我对join执行update时,我将要更新的表首先放在连接列表中。

这是我最后的结果。我确实需要用PAM_SpecialOffer = NULL标记所有没有收到PAM_SpecialOffer = 1更新的产品,但这应该很容易!

UPDATE n
SET n.PAM_SpecialOffer = 1
FROM Item AS i
JOIN nitroasl_pamtable AS n
ON i.ID = n.ItemID
WHERE i.SaleType = 1
and (i.SaleStartDate > '2015-01-01' or i.SaleStartDate = '1899-12-31')
and i.SaleEndDate > getdate();

更新——最终修订

所以我对我的查询做了一些额外的修改。我确信有更好的方法来写这个,但这是我能做的最好的清理无效的"PAM_SpecialOffer = 1"行。测试与备份我们的数据库-工作很棒!我要把它设置为每隔几分钟在DB上运行一次。

/* Mark appropriate Sale items as 'PAM_SpecialOffer = 1' */
UPDATE n
SET n.PAM_SpecialOffer = 1
FROM Item AS i
JOIN nitroasl_pamtable AS n
ON i.ID = n.ItemID
WHERE i.SaleType >= 1
and (i.SaleStartDate >= '2015-04-01' or i.SaleStartDate = '1899-12-31')
and i.SaleEndDate >= getdate();

/* Cleanup 'PAM_SpecialOffer' */
UPDATE n
SET n.PAM_SpecialOffer = NULL
FROM Item AS i
JOIN nitroasl_pamtable AS n
ON i.ID = n.ItemID
WHERE i.SaleType < 1
or (i.SaleStartDate < '2015-04-01' and i.SaleStartDate <> '1899-12-31')
or i.SaleEndDate < getdate();

最新更新