sql - 如何在SQL Server中更好地复制一组数据

标签 sql sql-server tsql stored-procedures

我有几个相关的表,我希望能够在更新引用时复制某些行。

我想复制 Table1 中的一行,以及 Table2 和 Table3 中的所有相关行,并且我正在尝试找出一种无需迭代行的有效方法。

例如,我有一张篮子 table :

+----------+---------------+
| BasketId |  BasketName   |
+----------+---------------+
|        1 | Home Basket   |
|        2 | Office Basket |
+----------+---------------+

每个篮子里都有水果:

+---------+----------+-----------+
| FruitId | BasketId | FruitName |
+---------+----------+-----------+
|       1 |        1 | Apple     |
|       2 |        1 | Orange    |
|       3 |        2 | Mango     |
|       4 |        2 | Pear      |
+---------+----------+-----------+

每种水果都有一些特性:

+------------+---------+--------------+
| PropertyId | FruitId | PropertyText |
+------------+---------+--------------+
|          1 |       2 | Is juicy     |
|          2 |       2 | Hard to peel |
|          3 |       1 | Is red       |
+------------+---------+--------------+

对于此示例,我的属性特定于单个水果行,这些“苹果”属性并不是所有篮子中所有苹果的属性,仅适用于该特定篮子中的特定苹果。

我想做的是复制一个篮子。因此,给定篮子 1,我想创建一个新篮子,复制它包含的水果行,并复制指向这些水果的属性。最后我希望得到这样的数据:

+----------+---------------+
| BasketId |  BasketName   |
+----------+---------------+
|        1 | Home Basket   |
|        2 | Office Basket |
|        3 | Friends Basket|
+----------+---------------+

+---------+----------+-----------+
| FruitId | BasketId | FruitName |
+---------+----------+-----------+
|       1 |        1 | Apple     |
|       2 |        1 | Orange    |
|       3 |        2 | Mango     |
|       4 |        2 | Pear      |
|       5 |        3 | Apple     |
|       6 |        3 | Orange    |
+---------+----------+-----------+

+------------+---------+--------------+
| PropertyId | FruitId | PropertyText |
+------------+---------+--------------+
|          1 |       2 | Is juicy     |
|          2 |       2 | Hard to peel |
|          3 |       1 | Is red       |
|          4 |       6 | Is juicy     |
|          5 |       6 | Hard to peel |
|          6 |       5 | Is red       |
+------------+---------+--------------+

复制篮子及其水果非常简单,但在我看来,复制水果的属性会导致迭代行,我希望 TSQL 中有更好的解决方案。

有什么想法吗?

最佳答案

为什么不加入 FruitName 来获取包含新旧 FruitId 的表?考虑到会同时添加信息......这可能不是最好的选择,但你不会使用任何周期。

INSERT INTO BASKET(BASKETNAME)
VALUES ('COPY BASKET')

DECLARE @iBasketId int
SET @iBasketId = @@SCOPE_IDENTITY;


insert into Fruit (BasketId, FruitName)
select @iBasketId, FruitName
from Fruit 
where BasketId = @originalBasket

declare @tabFruit table (originalFruitId int, newFruitId int)

insert into @tabFruit (originalFruitId, newFruitId)
select o.FruitId, n.FruitId
from (SELECT FruitId, FruitName from Fruit where BasketId = @originalBasket) as o
join (SELECT FruitId, FruitName from Fruit where BasketId = @newBasket) as n
    on o.FruitName = n.FruitName


insert into Property (FruitId, PropertyText)
select NewFruitId, PropertyText
from Fruit f join @tabFruit t on t.originalFruitId = f.FruitId

关于sql - 如何在SQL Server中更好地复制一组数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31866942/

相关文章:

在同一条目上并行更新的 Mysql 锁(使用 sidekiq)

c# - 向我解释这个 SELECT dbo.TableName(@variable) 语句

sql - 使用两列创建索引和在两列上创建单独索引之间的区别

sql - tSQL 不在查询中

sql-server-2005 - T-SQL 存储过程 - 动态 AND/OR 运算符

SQL 移动平均线

mysql - 具有多个表连接的每个组的前 N ​​个

SQL 以任意顺序查找第一个非空值

mysql - 查询不返回所有预期的行

sql-server - 需要帮助从表创建分类帐