我正在复制某些数据的子集,以便将来可以独立修改副本。
我的一个SQL语句看起来像这样(我改变了表名和列名):
INSERT Product(
ProductRangeID,
Name, Weight, Price, Color, And, So, On
)
SELECT
@newrangeid AS ProductRangeID,
Name, Weight, Price, Color, And, So, On
FROM Product
WHERE ProductRangeID = @oldrangeid and Color = 'Blue'
也就是说,我们推出了一个新的产品系列,最初只包含新SKU下某些指定电流范围内的所有蓝色产品。将来我们可能会改变产品的“蓝色”版本,而不是旧版本。
我对SQL很陌生:我应该做些什么来避免列出所有这些列,或者至少避免列出两次?我可以使用当前代码,但如果将新列添加到Product,我宁愿不回来修改它。在目前的形式中,如果我忘记这样做,它就会默默地无法复制新列,这应该在测试中显示但不是很好。
我正在复制除ProductRangeID(我修改),ProductID(递增主键)和两个DateCreated和timestamp列(它们为新行自动生成的值)之外的每一列。
顺便说一下,我怀疑我应该在ProductID和ProductRangeID之间有一个单独的连接表。我没有定义表格。
这是在SQL Server 2008上的T-SQL存储过程中,如果这有任何区别。
答案 0 :(得分:1)
在SELECT
中,您可以使用*
或明确列出所有列和表达式,但不存在部分通配符。
如果只是一次性查询且性能不重要,您可以在临时表或表变量中执行SELECT *
,后跟表UPDATE
。
答案 1 :(得分:1)
您可以省略目标表的字段名称,但通常不应该。
如果未指定目标表的字段,则将依赖于在表中定义它们的顺序。如果有人更改了该顺序,查询将停止工作。或者更糟糕的是,它可以将值放在错误的字段中。
另一个方面是,查看查询的功能会更容易,这样您就不必打开表格来查看字段是什么来理解查询。