Sql 将不同表中的一列设置为另一列

Sql 将不同表中的一列设置为另一列,sql,sql-server-2008,sql-update,Sql,Sql Server 2008,Sql Update,我对SQL相当陌生,我正在尝试创建一个SQL命令来检查某个表中的某个值是否等于某个值,然后更新另一个表中某个值。我曾在网上寻找解决方案,但我还不足以确定我所看到的是否可以用来实现我想要实现的目标 下面是我正在使用的表和列的实际名称: 项目(使用“ID”) SaleType(int,非null) nitroasl_pamtable(使用“项目ID”) PAM_specialloffer(位,非空) 两个表中产品之间共享的“ID”如下所示: -“项目”表中的“ID”列 -“nitroas

我对SQL相当陌生,我正在尝试创建一个SQL命令来检查某个表中的某个值是否等于某个值,然后更新另一个表中某个值。我曾在网上寻找解决方案,但我还不足以确定我所看到的是否可以用来实现我想要实现的目标

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

  • 项目(使用“ID”)
    • SaleType(int,非null)
  • nitroasl_pamtable(使用“项目ID”)
    • PAM_specialloffer(位,非空)
两个表中产品之间共享的“ID”如下所示: -“项目”表中的“ID”列 -“nitroasl_pamtable”表中的“ItemID”列

我需要做的是浏览“Item”表,找到所有“SaleType”等于“1”的产品,然后通过将“PAM_SpecialLoffer”设置为“1”来更新“nitroasl_pamtable”中的ID

以下是我想做的(顺便说一句,这是一个非常粗略的猜测)

我希望上述内容是有意义的,因为我发现用文字来表达有点困难,但简而言之,我正试图在两个不同的表中分别使用“ID”和“ItemID”(分别)用“SaleType=1”和“PAM_SpecialOffer=1”来标记所有产品

更新

下面是我想要更改的集合的列表。ID完全匹配,等等。现在我如何
用“1”更新
PAM_SpecialOffer
列(如何更改以下代码以实现此目的)


看来你的陈述会起作用。但是,我会这样写:

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
是表格别名,是表格名称的缩写。在某些情况下,它们是必要的。在这里,它们只是澄清查询在做什么以及列来自哪里


通常,当我使用
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”行的方法。测试了我们的数据库备份-工程伟大!我将在数据库上设置为每隔几分钟运行一次

/* 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();
/*将适当的销售项目标记为“PAM_SpecialOffer=1”*/
更新
设置n.PAM_SpecialOffer=1
从我的项目
加入nitroasl_pamtable作为n
在i.ID=n.ItemID上
其中i.SaleType>=1
和(i.SaleStartDate>='2015-04-01'或i.SaleStartDate='1899-12-31')
和i.SaleEndDate>=getdate();
/*清理“PAM_Specialloffer”*/
更新
设置n.PAM_SpecialOffer=NULL
从我的项目
加入nitroasl_pamtable作为n
在i.ID=n.ItemID上
其中i.SaleType<1
或(i.SaleStartDate<'2015-04-01'和i.SaleStartDate'1899-12-31')
或i.SaleEndDate
看起来它可能会起作用。当你尝试时会发生什么?您可能需要为正在更新的表添加别名。而且,在联接条件中,您肯定应该使用TableName.ColumnName,而不是像现在这样只使用ColumnName。我会为这些表添加别名以避免歧义,但是,是的,您的做法是正确的。我不知道SQL中的别名是什么。我得查一下。。。我还刚刚意识到我需要加入额外的逻辑。我需要检查
项目中的
SaleStartDate
SaleEndDate
值。我的头很痛…我如何“预览”这些更改以确保命令在运行之前工作?开始TRANS“UPDATE语句”“SELECT语句”回滚这看起来与添加附加逻辑之前的操作非常相似。非常感谢你!这本可以满足我大部分的需要+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();
/* 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();