如何在插入内容和来源之间创建 link
How to make a link between what was inserted and where it came from
我正在插入一个 table 像
Items (itemId, name) 其中 id 是一个身份。
来自这样的table
RawData(名称、描述、其他信息) 其中多个名称是可能的。比如"A"出现了3次,假设是这样
A,Desc1,x
A,Desc1,y
A,Desc2,z
B,Desc1,x
插入项目后,我得到了 "A" 的 3 个条目,比方说
1,A
2,A
3,A
4,B
现在我想插入一个名为 table 的
描述(DescriptionId、ItemId、描述)
我无法准确提供填充 itemId 1、2、3 的 SQL,因为将 Items 连接回 RawData 不会不提供 1:1
我想做
INSERT INTO Descriptions
SELECT ItemId, description
FROM RawData R
INNER JOIN Items I ON I.name = R.name
我想要的是加入它并让它像(最后两列是项目)
A,Desc1,x,1,A
A,Desc1,y,2,A
A,Desc2,z,3,A
B,Desc1,x,4,B
我得到的是
A,Desc1,x,1,A
A,Desc1,x,1,A
A,Desc1,x,1,A
A,Desc1,y,2,A
A,Desc1,y,2,A
A,Desc1,y,2,A
A,Desc2,z,3,A
A,Desc2,z,3,A
A,Desc2,z,3,A
B,Desc1,x,4,B
我想到的一个解决方案是向 RawData 添加一个标识,然后在我插入到 Items 中时包含该标识以帮助我 link table 恢复到原来的状态。然后当我完成删除该列。但这似乎是一种非常 hacky 的方式。
我能想到的另一个解决方案是SQL喜欢
INSERT INTO Descriptions
SELECT DISTINCT ItemId, description
FROM RawData R
INNER JOIN Items I ON I.name = R.name
但这在我的真实示例中不起作用。我从 RawData 中的 200 个项目开始,在加入后以 215 个项目结束,所以很明显 1:1 没有发生
我正在寻找通用的方法来解决我的问题。适用于这个特定示例的解决方案并不多(这就是示例如此基础的原因)
由于您的目标是在导入时填充 Descriptions
table 与新填充的 Items
匹配的原始数据,您可以向 Items
添加一列 table 这将唯一标识一行并在填充 Descriptions
.
后删除它
假设在你的情况下,唯一性是 (name, description, otherinfo)
。
SQL Fiddle 向您展示它是如何工作的。
正在创建 tables
CREATE TABLE items(itemid int primary key auto_increment, name text);
CREATE TABLE descriptions(descriptionid int primary key auto_increment, itemid int, description text);
CREATE TABLE rawdata(name text, description text, otherinfo text);
添加临时列
ALTER TABLE items ADD COLUMN tmp_unique text;
正在填充项目
INSERT INTO items (name, tmp_unique)
SELECT name, concat(description, '#', otherinfo)
FROM rawdata;
填充说明
INSERT INTO descriptions (itemid, description)
SELECT itemid, description
FROM rawdata r
INNER JOIN items i ON
r.name = i.name
AND concat(r.description, '#', r.otherinfo) = i.tmp_unique;
正在删除临时列
ALTER TABLE items DROP COLUMN tmp_unique;
注意:如果您关心速度,那么在您的情况下,您可以创建两个唯一的列并分别放置来自原始数据的描述和其他信息,然后在填充描述时将这两列连接起来。
刚想到这个,所以我想将其添加为一个潜在的解决方案。
将标识列 "ID" 添加到 RawData。
插入项目之前:
DECLARE @StartId INT = ( SELECT IDENT_CURRENT('dbo.Items'));
然后使用 RawData 的 @StartId + ID
为 Items
使用 Identity INSERT;
之后你可以使用
SELECT @StartId+ID as ItemId, description
FROM RawData R
我正在插入一个 table 像
Items (itemId, name) 其中 id 是一个身份。
来自这样的table
RawData(名称、描述、其他信息) 其中多个名称是可能的。比如"A"出现了3次,假设是这样
A,Desc1,x
A,Desc1,y
A,Desc2,z
B,Desc1,x
插入项目后,我得到了 "A" 的 3 个条目,比方说
1,A
2,A
3,A
4,B
现在我想插入一个名为 table 的 描述(DescriptionId、ItemId、描述)
我无法准确提供填充 itemId 1、2、3 的 SQL,因为将 Items 连接回 RawData 不会不提供 1:1
我想做
INSERT INTO Descriptions
SELECT ItemId, description
FROM RawData R
INNER JOIN Items I ON I.name = R.name
我想要的是加入它并让它像(最后两列是项目)
A,Desc1,x,1,A
A,Desc1,y,2,A
A,Desc2,z,3,A
B,Desc1,x,4,B
我得到的是
A,Desc1,x,1,A
A,Desc1,x,1,A
A,Desc1,x,1,A
A,Desc1,y,2,A
A,Desc1,y,2,A
A,Desc1,y,2,A
A,Desc2,z,3,A
A,Desc2,z,3,A
A,Desc2,z,3,A
B,Desc1,x,4,B
我想到的一个解决方案是向 RawData 添加一个标识,然后在我插入到 Items 中时包含该标识以帮助我 link table 恢复到原来的状态。然后当我完成删除该列。但这似乎是一种非常 hacky 的方式。
我能想到的另一个解决方案是SQL喜欢
INSERT INTO Descriptions
SELECT DISTINCT ItemId, description
FROM RawData R
INNER JOIN Items I ON I.name = R.name
但这在我的真实示例中不起作用。我从 RawData 中的 200 个项目开始,在加入后以 215 个项目结束,所以很明显 1:1 没有发生
我正在寻找通用的方法来解决我的问题。适用于这个特定示例的解决方案并不多(这就是示例如此基础的原因)
由于您的目标是在导入时填充 Descriptions
table 与新填充的 Items
匹配的原始数据,您可以向 Items
添加一列 table 这将唯一标识一行并在填充 Descriptions
.
假设在你的情况下,唯一性是 (name, description, otherinfo)
。
SQL Fiddle 向您展示它是如何工作的。
正在创建 tables
CREATE TABLE items(itemid int primary key auto_increment, name text);
CREATE TABLE descriptions(descriptionid int primary key auto_increment, itemid int, description text);
CREATE TABLE rawdata(name text, description text, otherinfo text);
添加临时列
ALTER TABLE items ADD COLUMN tmp_unique text;
正在填充项目
INSERT INTO items (name, tmp_unique)
SELECT name, concat(description, '#', otherinfo)
FROM rawdata;
填充说明
INSERT INTO descriptions (itemid, description)
SELECT itemid, description
FROM rawdata r
INNER JOIN items i ON
r.name = i.name
AND concat(r.description, '#', r.otherinfo) = i.tmp_unique;
正在删除临时列
ALTER TABLE items DROP COLUMN tmp_unique;
注意:如果您关心速度,那么在您的情况下,您可以创建两个唯一的列并分别放置来自原始数据的描述和其他信息,然后在填充描述时将这两列连接起来。
刚想到这个,所以我想将其添加为一个潜在的解决方案。
将标识列 "ID" 添加到 RawData。
插入项目之前:
DECLARE @StartId INT = ( SELECT IDENT_CURRENT('dbo.Items'));
然后使用 RawData 的 @StartId + ID
为 Items
使用 Identity INSERT;
之后你可以使用
SELECT @StartId+ID as ItemId, description
FROM RawData R