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

时间:2015-05-19 19:39:54

标签: sql sql-server-2008 sql-update

我对SQL很新,我正在尝试创建一个SQL命令检查是否某些内容等于某个表中的内容,然后更新另一个表中某些内容的值。我在网上寻找解决方案,但我还不够好,无法确定我所看到的内容是否可以用来完成我想要完成的任务。

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

  • 项目(使用“ID”)
    • SaleType(int,not null)
  • nitroasl_pamtable(使用“ItemID”)
    • PAM_SpecialOffer(位,非空)

两个表中的产品之间共享的“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();

2 个答案:

答案 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;

ipt是表别名,表名的缩写。在某些情况下,它们是必要的。在这里,他们只是澄清了查询的作用以及列的来源。

通常情况下,当我使用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();