我想用SQL编写脚本,该脚本会将这2个表(A,B)复制到其他2个表(C,D),并具有与A,B相同的结构。
重要提示 :
表A具有表B的外键(fk_a_b)
________________________ _________________
| Table A | | Table B |
|______________________| |_______________|
| id FK_A_B name | | id visible |
| ----- -------- ------| | ----- --------|
| 1 21 n1 | | 21 true |
| 5 32 n2 | | 32 false |
------------------------ -----------------
假设将表B复制到D之后,这就是我得到的
________________
| Table D |
|______________|
| id visible |
| ----- -------|
| 51 true |
| 52 false |
----------------
现在,当我将表A复制到CI时,需要知道,ID = 21现在映射到ID = 51,ID = 32映射到ID = 52。最后,表C将为:
________________________
| Table C |
|______________________|
| id FK_C_D name |
| ----- -------- ------|
| 61 51 n1 |
| 62 52 n2 |
------------------------
由于多个进程可能同时调用脚本,因此我无法更改表A,B来添加一些帮助程序列。因此,为了达到这个目的,我使用了CURSOR。我逐行复制表B和托管临时表以将OldId映射到NewId(21->
51,32-> 52),然后使用此临时表复制表A。
我读过CURSOR是不好的做法。那么,还有另一种方法吗?
谢谢
您可以将output子句与merge语句一起使用,以获取源ID和目标ID之间的映射。
这是您可以测试的一些代码。我使用表变量而不是实际表。
设置样本数据:
-- @A and @B is the source tables
declare @A as table
(
id int,
FK_A_B int,
name varchar(10)
)
declare @B as table
(
id int,
visible bit
)
-- Sample data in @A and @B
insert into @B values (21, 1),(32, 0)
insert into @A values (1, 21, 'n1'),(5, 32, 'n2')
-- @C and @D is the target tables with id as identity columns
declare @C as table
(
id int identity,
FK_C_D int not null,
name varchar(10)
)
declare @D as table
(
id int identity,
visible bit
)
-- Sample data already in @C and @D
insert into @D values (1),(0)
insert into @C values (1, 'x1'),(1, 'x2'),(2, 'x3')
复制数据:
-- The @IdMap is a table that holds the mapping between
-- the @B.id and @D.id (@D.id is an identity column)
declare @IdMap table(TargetID int, SourceID int)
-- Merge from @B to @D.
merge @D as D -- Target table
using @B as B -- Source table
on 0=1 -- 0=1 means that there are no matches for merge
when not matched then
insert (visible) values(visible) -- Insert to @D
output inserted.id, B.id into @IdMap; -- Capture the newly created inserted.id and
-- map that to the source (@B.id)
-- Add rows to @C from @A with a join to
-- @IdMap to get the new id for the FK relation
insert into @C(FK_C_D, name)
select I.TargetID, A.name
from @A as A
inner join @IdMap as I
on A.FK_A_B = I.SourceID
结果:
select *
from @D as D
inner join @C as C
on D.id = C.FK_C_D
id visible id FK_C_D name
----------- ------- ----------- ----------- ----------
1 1 1 1 x1
1 1 2 1 x2
2 0 3 2 x3
3 1 4 3 n1
4 0 5 4 n2
问题内容: 我有以下内容: 但是,并非总是有一个结果会给我以下错误: NoSuchElementException:没有值 那么,如果没有值,我该如何返回? 问题答案: 您可以使用,它比检查要简单得多:
问题内容: 我需要部署到Red Hat 4.1.2盒子(具有gcc 4.1.2)。我在Ubuntu 11.10上使用GCC 4.6.1进行开发。不幸的是,我的构建过程创建的某些二进制文件无法在RedHat计算机上使用。原因似乎是ABI更改,根据另一个Stackoverflow问题,这是由于引入STT_GNU_IFUNC符号导致的。有没有一种方法可以防止导出任何此类符号,以便我的二进制文件可以使用旧
我有一个用户表,其中我有(Id,reportingUserId)。reportingUserId 包含一个字符串,该字符串表示用户向其报告的用户 Id(上级)。现在,在删除用户时,我应该检查是否有任何用户向此用户报告。如果它们存在,那么我应该将其报告用户 Id 值更改为上级的用户 Id。此处报告用户是当前用户的劣势列表。 现在,当我这样做的时候,我得到了lambda表达式中使用的在第二个if条件的
问题内容: 我对SQL完全陌生,但是可以说,在StackExchange Data Explorer上 ,我只想按信誉列出前15位用户,并且我写了这样的内容: 我认为,这目前是有意义的,因为不是中的列。我可以轻松地说出这个问题,基本上是在重复公式。 因此,问题是: 我可以在条款中实际使用“列”吗? 我是否可能需要使用此列创建一个虚拟表/视图,然后对其进行查询? 我可以命名一个表达式吗,例如,所以我
问题内容: 我设计了一个简单的函数来返回数学函数,该函数可用于拟合实验数据。这些功能看起来很像以下内容: 不幸的是,我在RunTimeWarnings中遇到了麻烦: 由于值太大或太小。但我无法自行解决此问题。有什么办法可以重新定义我的功能,使其在没有警告的情况下通过? 问题答案: 使用以控制在这种情况下做什么numpy的:http://docs.scipy.org/doc/numpy/refere
问题内容: 当我由于在Dockerfile中进行了更改而在Docker中运行命令以重建映像时,有时会收到“无”映像标签。我们如何避免这个事实?我想重建图像,但不显示 任何 图像。 问题答案: 以下是什么是Docker 映像? 善良 这些是 中间 图像,可以使用查看。它们不会导致磁盘空间问题,但绝对是屏幕空间问题。由于所有这些图像在其含义上都可能会造成混乱。 坏人 这些映像是 悬空 的,可能会导致磁