在不同的表中将一列设置为与另一列相等
Set One Column Equal to Another In Different Tables
我是 SQL 的新手,我正在尝试创建一个 SQL 命令来检查某些内容是否等于某个 table 中的某些内容,然后更新某些内容的值在另一个 table 中。我已经在网上寻找解决方案,但我还不够好,无法确定我所看到的是否可以用来完成我想完成的事情。
下面是我正在使用的 table 和列的实际名称:
- 项目(使用 "ID")
- 销售类型(整数,不为空)
- nitroasl_pamtable(使用 "ItemID")
- PAM_SpecialOffer(位,不为空)
两个table产品之间共享的"ID"如下:
- "Item" table 中的 "ID" 列
- "nitroasl_pamtable" table
中的 "ItemID" 列
我需要做的是遍历 "Item" table 并找到 "SaleType" 等于“1”的所有产品 - 然后更新 "nitroasl_pamtable" 中的那些 ID通过设置 "PAM_SpecialOffer" 等于“1”。
下面的能做我想做的事吗(顺便说一句,这是一个非常粗略的猜测)?
UPDATE nitroasl_pamtable
SET PAM_SpecialOffer = SaleType
FROM Item
INNER JOIN nitroasl_pamtable
ON ID = ItemID
WHERE SaleType = 1
我希望以上内容是有道理的,因为我发现它有点难以用语言表达,但简而言之,我试图用 "SaleType=1" 和 "PAM_SpecialOffer=1" 标记所有产品在两个不同的 table 中使用 "ID" 和 "ItemID"(分别)。
更新
因此,下面列出了我要更改的集合。 ID 完美匹配,等等。现在我如何 UPDATE
带有“1”的 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;
i
和pt
是table的别名,是table名字的缩写。在某些情况下,它们是必要的。在这里,他们只是阐明查询在做什么以及列的来源。
通常,当我使用 join
执行 update
时,我会将要更新的 table 放在连接列表的第一个。
这是我最后得到的。我确实需要用 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();
我是 SQL 的新手,我正在尝试创建一个 SQL 命令来检查某些内容是否等于某个 table 中的某些内容,然后更新某些内容的值在另一个 table 中。我已经在网上寻找解决方案,但我还不够好,无法确定我所看到的是否可以用来完成我想完成的事情。
下面是我正在使用的 table 和列的实际名称:
- 项目(使用 "ID")
- 销售类型(整数,不为空)
- nitroasl_pamtable(使用 "ItemID")
- PAM_SpecialOffer(位,不为空)
两个table产品之间共享的"ID"如下: - "Item" table 中的 "ID" 列 - "nitroasl_pamtable" table
中的 "ItemID" 列我需要做的是遍历 "Item" table 并找到 "SaleType" 等于“1”的所有产品 - 然后更新 "nitroasl_pamtable" 中的那些 ID通过设置 "PAM_SpecialOffer" 等于“1”。
下面的能做我想做的事吗(顺便说一句,这是一个非常粗略的猜测)?
UPDATE nitroasl_pamtable
SET PAM_SpecialOffer = SaleType
FROM Item
INNER JOIN nitroasl_pamtable
ON ID = ItemID
WHERE SaleType = 1
我希望以上内容是有道理的,因为我发现它有点难以用语言表达,但简而言之,我试图用 "SaleType=1" 和 "PAM_SpecialOffer=1" 标记所有产品在两个不同的 table 中使用 "ID" 和 "ItemID"(分别)。
更新
因此,下面列出了我要更改的集合。 ID 完美匹配,等等。现在我如何 UPDATE
带有“1”的 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;
i
和pt
是table的别名,是table名字的缩写。在某些情况下,它们是必要的。在这里,他们只是阐明查询在做什么以及列的来源。
通常,当我使用 join
执行 update
时,我会将要更新的 table 放在连接列表的第一个。
这是我最后得到的。我确实需要用 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();