【发布时间】:2015-07-31 19:36:28
【问题描述】:
我对 SQL 还很陌生,我正在尝试创建一个 SQL 命令来检查某个表中的某个值是否等于某个值,然后更新另一个表中某个值的值。我在网上寻找过解决方案,但我还不够好,无法确定我所看到的是否可以用来完成我想要完成的事情。
以下是我正在使用的表和列的实际名称:
- 项目(使用“ID”)
- SaleType(整数,非空)
- nitroasl_pamtable(使用“ItemID”)
- PAM_SpecialOffer(位,非空)
两个表中产品之间共享的“ID”如下: - “项目”表中的“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
我希望以上内容是有道理的,因为我发现它有点难以用语言表达,但简而言之,我正在尝试将所有带有“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();
【问题讨论】:
-
看起来它可能会起作用。当你尝试它时会发生什么?您可能需要为要更新的表设置别名。您绝对应该在连接条件中使用 TableName.ColumnName,而不是像现在这样使用 ColumnName。
-
我会为这些表加上别名以避免歧义,但是是的,您走在正确的轨道上。
-
我不知道 SQL 中的别名是什么。我将不得不查找它们......我也刚刚意识到我需要加入额外的逻辑。我需要检查
Item中的SaleStartDate和SaleEndDate值。我的头好痛…… -
我如何“预览”这些更改以确保命令在运行之前有效?
-
BEGIN TRANS "UPDATE 语句" "SELECT 语句" ROLLBACK
标签: sql sql-server-2008 sql-update