我对SQL很新,我正在尝试创建一个SQL命令检查是否某些内容等于某个表中的内容,然后更新另一个表中某些内容的值。我在网上寻找解决方案,但我还不够好,无法确定我所看到的内容是否可以用来完成我想要完成的任务。
以下是我正在使用的表和列的实际名称:
两个表中的产品之间共享的“ID”如下: - “项目”表中的“ID”列 - “nitroasl_pamtable”表中的“ItemID”列
我需要做的是浏览“Item”表并查找所有“SaleType”等于“1”的产品 - 然后通过将“PAM_SpecialOffer”设置为“1”来更新“nitroasl_pamtable”中的ID。 / p>
以下是否能够做到我想要的(这是一个非常粗略的猜测btw)?
UPDATE nitroasl_pamtable
SET PAM_SpecialOffer = SaleType
FROM Item
INNER JOIN nitroasl_pamtable
ON ID = ItemID
WHERE SaleType = 1
我希望上述内容有道理,因为我发现它有点难以言辞,但简而言之,我试图用“SaleType = 1”标记所有产品,其中“PAM_SpecialOffer = 1”两个不同的表使用“ID”和“ItemID”(分别)。
更新
所以,下面给我一个我要改变的集合列表。这些ID完美匹配,等等。现在我如何UPDATE
PAM_SpecialOffer
列为“1”(如何更改以下代码才能执行此操作)?
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();
答案 0 :(得分:1)
看来你的陈述会起作用。但是,我会把它写成:
UPDATE pt
SET PAM_SpecialOffer = i.SaleType
FROM nitroasl_pamtable pt INNER JOIN
Item i
ON i.ID = pt.ItemID
WHERE i.SaleType = 1;
i
和pt
是表别名,表名的缩写。在某些情况下,它们是必要的。在这里,他们只是澄清了查询的作用以及列的来源。
通常情况下,当我使用update
执行join
时,我会先将表格更新到联接列表中。
答案 1 :(得分:0)
这是我最终的结果。我需要标记所有未通过PAM_SpecialOffer = 1
收到PAM_SpecialOffer = NULL
更新的产品,但这应该很简单!
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();