UPDATE / INSERT使一对多表成为一对一 [英] UPDATE/INSERT to make One-to-Many table become One-to-One

查看:86
本文介绍了UPDATE / INSERT使一对多表成为一对一的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个场景,其中两个表是一对多的关系

我需要将数据从Many表移动到One表所以

它变成了一对一的关系。


我需要从许多表中挽救记录而不需要将b / b
详细记录下来,其中一个我不能做相反的原因

在ONE表中有记录我需要保留,即使他们

没有任何子记录在MANY表中。


下面我创建了创建示例表的代码:


1- tblProducts是ONE side table

2- tblProductDetails是很多边表

3- tblProductsResult是运行后我期望得到的结果

一些T-SQL代码
4- tblProductComponents是tblProducts的另一个多边桌子

5- tblProductComponentsResult是我期望得到的结果...


一些需要考虑的要点:

6-通常所有UniqueID列都是IDENTITY。对于

这个示例我自己输入了UniqueID值。

7-我不想创建像tblProductsResult这样的新表

和tblProductComponentsResult。我想更新真实的表。

我已经为这篇文章创建了tblxxxResult表。

8-目标是通过提供更新产品名称来自tblProductDetails的第一个匹配名称的
名称。

9-如果每个

产品的tblProductDetails中有多个条目,则我需要创建继承原始

产品信息的新产品,包括来自tblProductComponents的子记录。


如果运行代码并打开表格它会更直观地看到我想要实现的目标。


创建数据库MyTestDB

GO

USE MyTestDB

GO


CREATE TABLE [dbo]。[tblProducts](

[UniqueID] [int ] NOT NULL PRIMARY KEY,

[Name] [varchar](80)NULL,

[TagNo] [int] NULL

)ON [主要]

GO


INSERT INTO tblProducts VALUES(1,''ABC '',55)

INSERT INTO tblProducts VALUES(2,''DEF'',66)

INSERT INTO tblProducts VALUES(3,''GHI'',77 )

INSERT INTO tblProducts VALUES(4,''JKL'',88)

CREATE TABLE [dbo]。[tblProductDetails](

[UniqueID] [int] NOT NULL PRIMARY KEY,

[Name] [varchar](80)NULL,

[ProductID] int

)ON [PRIMARY]

GO


INSERT INTO tblProductDetails VALUES(1,''ABC1'',1)

INSERT INTO tblProductDetails VALUES(2,''DEF'',2)

INSERT INTO tblProductDetails VALUES(3,''GHI'',3)

INSERT INTO tblProductDetails VALUES(4,''GHI2'',3)

INSERT INTO tblProductDetails VALUES(5,''GHI3'',3)

INSERT INTO tblProductDetails VALUES( 6,''JKL2'',4)

INSERT INTO tblProductDetails VALUES(7,''JKL'',4)

INSERT INTO tblProductDetails VALUES(8,' JKL3'',4)

INSERT INTO tblProductDetails VALUES(9,''JKL4'',4)


CREATE TABLE [dbo]。[tblProductComponents] (

[UniqueID] [int] NOT NULL PRIMARY KEY,

[ProductID] int,

[Component] [varchar](80) NULL

)ON [PRIMARY]

GO


INSERT INTO tblProductComponents VALUES(1,1,''ABCa'')

INSERT INTO tblProductComponents VALUES(2,1,''ABCb'')

INSERT INTO tblProductComponents VALUES(3,1,''ABCc'')

INSERT INTO tblProductComponents VALUES(4,2,''DEFa'')

INSERT INTO tblProductComponents VALUES(5,2,''DEFb'')

INSERT INTO tblProductComponents VALUES(6,2,''DEFc'')

INSERT INTO tblProductComponents VALUES(7,2,''DEFd'')

INSERT INTO tblProductComponents VALUES (8,3,''GHIa'')

INSERT INTO tblProductComponents VALUES(9,4,'''JKLa' ')

INSERT INTO tblProductComponents VALUES(10,4,''JKLb'')


CREATE TABLE [dbo]。[tblProductComponentsResult](

[UniqueID] [int] NOT NULL PRIMARY KEY,

[ProductID] int,

[Component] [varchar](80)NULL

)ON [PRIMARY]

GO


INSERT INTO tblProductComponentsResult VALUES(1,1,''ABCa'')

INSERT INTO tblProductComponentsResult VALUES(2,1,''ABCb'')

INSERT INTO tblProductComponentsResult VALUES(3,1,''ABCc'')

INSERT INTO tblProductComponentsResult VALUES(4,2,''DEFa'')

INSERT INTO tblProductComponentsResult VALUES(5,2,''DEFb'')

INSERT INTO tblProductComponentsResult VALUES (6,2,''DEFc'')

INSERT INTO tblProductComponentsResult VALUES(7,2,''DEFd'')

INSERT INTO tblProductComponentsResult VALUES(8,3 ,''GHIa'')

INSERT INTO tb lProductComponentsResult VALUES(9,4,''JKLa'')

INSERT INTO tblProductComponentsResult VALUES(10,4,''JKLb'')

INSERT INTO tblProductComponentsResult VALUES(11 ,5,''GHIa'')

INSERT INTO tblProductComponentsResult VALUES(12,6,''GHIa'')

INSERT INTO tblProductComponentsResult VALUES(13,7,' 'JKLa'')

INSERT INTO tblProductComponentsResult VALUES(14,7,''JKLb'')

INSERT INTO tblProductComponentsResult VALUES(15,8,''JKLa'' )

INSERT INTO tblProductComponentsResult VALUES(16,8,''JKLb'')

INSERT INTO tblProductComponentsResult VALUES(17,9,''JKLa'')

INSERT INTO tblProductComponentsResult VALUES(18,9,''JKLb'')

CREATE TABLE [dbo]。[tblProductsResult](

[UniqueID] [ int] NOT NULL PRIMARY KEY,

[Name] [varchar](80)NULL,

[TagNo] [int] NULL

) ON [主要]

GO


INSERT INTO tblProductsResult VALUES(1,''ABC1'',55)

INSERT INTO tblProductsResult VALUES( 2,''DEF'',66)

INSERT INTO tblProductsResult VALUES(3,''GHI'',77)

INSERT INTO tblProductsResult VALUES(4,''' JKL'',88)

INSERT INTO tblProductsResult VALUES(5,''GHI2'',77)

INSERT INTO tblProductsResult VALUES(6,''GHI3'', 77)

INSERT INTO tblProductsResult VALUES(7,''JKL2'',88)

INSERT INTO tblProductsResult VALUES(8,''JKL3'',88)

INSERT INTO tblProductsResult VALUES(9,''JKL4'',88)

感谢您对此的帮助。

非常感谢你/>

解决方案

您好


您可以使用sp_rename重命名您的表tblproducts然后使用一些东西

喜欢:


INSERT INTO [dbo]。[tblProducts]([UniqueID],[N ame],TagId)

select [SELECT COUNT(*)

来自[dbo]。[oldtblProducts] Q

JOIN [dbo]。 tblProductDetails E ON E. [ProductID] = Q. [UniqueID]

WHERE D. [ProductID]> E. [ProductID]

OR(D。[ProductID] = E. [ProductID] AND D.Name> E.Name))+ 1 AS UniqueID,

D.Name,P.TagNo
来自[dbo]的
。[oldtblProducts] P

JOIN [dbo] .tblProductDetails D ON D. [ProductID] = P. [UniqueID ]


John


" serge" < SE **** @ nospam.ehmail.com>在消息中写道

新闻:mN ********************* @ wagner.videotron.net。 ..

我有一个场景,其中两个表是一对多的关系
我需要将数据从Many表移动到One表所以
它变成了一对一的关系。

我需要从许多表中挽救记录而不必详细说明,这是我无法做到的原因之一相反,
在ONE表中有记录,即使他们在MANY表中没有任何子记录,我也需要保留。

下面我创建了用于创建样本表的代码:

1- tblProducts是ONE侧表
2- tblProductDetails是MANY边表
3- tblProductsResult是我期望得到的结果运行
一些T-SQL代码
4- tblProductComponents是tblProducts的另一个多边的表格
5- tblProductComponentsResult是我期望得到的结果...

一些要考虑的要点:
6-通常所有的UniqueID列都是IDENTITY。对于
此示例,我自己输入了UniqueID值。
7-我不想创建像tblProductsResult
和tblProductComponentsResult这样的新表。我想更新真实的表。
我已经为这篇文章创建了tblxxxResult表。
8-目标是通过给它的名称来更新产品的名称。第一个匹配来自tblProductDetails的名称。
9-如果每个产品的tblProductDetails中有多个条目,那么我需要创建继承原始产品信息的新产品,包括来自
tblProductComponents的子记录。

如果您运行代码并打开表格,那么可以更清楚地看到我想要实现的目标。

创建数据库MyTestDB
GO
使用MyTestDB


创建表[dbo]。[tblProducts](
[UniqueID] [int] NOT NULL PRIMARY KEY,
[Name] [varchar](80)NULL,
[TagNo] [int] NULL
)ON [PRIMARY]
GO
插入产品价值(2,''DEF'',66)
INSERT INTO blProducts VALUES(3,''GHI'',77)
INSERT INTO tblProducts VALUES(4,''JKL'',88)

创建表[dbo]。[tblProductDetails](
[UniqueID] [int] NOT NULL PRIMARY KEY,
[Name] [varchar](80)NULL,
[ProductID] int
)ON [PRIMARY]
GO

INSERT INTO tblProductDetails VALUES(1,''ABC1'',1)
INSERT INTO tblProductDetails VALUES(2,''DEF'',2)
INSERT INTO tblProductDetails VALUES(3,''GHI'',3)
INSERT INTO tblProductDetails VALUES(4,''GHI2'',3)
INSERT INTO tblProductDetails VALUES(5,''GHI3'',3 )插入到tblProductDetails VALUES(6,''JKL2'',4)
INSERT INTO tblProductDetails VALUES(7,''JKL'',4)
INSERT INTO tblProductDetails VALUES(8, ''JKL3'',4)
INSERT INTO tblProductDetails VALUES(9,''JKL4'',4)

CREATE TABLE [dbo]。[tblProductComponents](
[ UniqueID] [int] NOT NULL PRIMARY KEY,
[ProductID] int,
[Component] [varchar](80)NULL
)ON [PRIMARY]


插入tblProductComponents VALUES(1,1,''ABCa'')
插入tblProductComponents值(2,1,''ABCb'')
插入tblProductComponents值(3,1,''ABCc'')
INSERT INTO tblProductComponents VALUES(4,2,''DEFa'')
INSERT INTO tblProductComponents VALUES(5,2,''DEFb'')
插入tblProductComponents VALUES(6,2 ,''DEFc'')
插入tblProductComponents值(7,2,''DEFd'')
插入tblProductComponents值(8,3,''GHIa'')
INSERT INTO tblProductComponents VALUES(9,4,''JKLa'')
INSERT INTO tblProductComponents VALUES(10,4,''JKLb'')

CREATE TABLE [dbo]。[tblProductComponentsResult] (
[UniqueID] [int] NOT NULL PRIMARY KEY,
[ProductID] int,
[Component] [varchar](80)NULL
)ON [PRIM ARY]


插入tblProductComponentsResult VALUES(1,1,''ABCa'')
INSERT INTO tblProductComponentsResult VALUES(2,1,''ABCb'')<插入到tblProductComponentsResult值(3,1,''ABCc'')
插入tblProductComponentsResult值(4,2,''DEFa'')
插入tblProductComponentsResult值(5,2, ''DEFb'')
INSERT INTO tblProductComponentsResult VALUES(6,2,''DEFc'')
INSERT INTO tblProductComponentsResult VALUES(7,2,''DEFd'')
INSERT INTO tblProductComponentsResult VALUES(8,3,''GHIa'')
INSERT INTO tblProductComponentsResult VALUES(9,4,''JKLa'')
INSERT INTO tblProductComponentsResult VALUES(10,4,''JKLb''插入tblProductComponentsResult值(11,5,''GHIa'')
INSERT INTO tblProductComponentsResult VALUES(12,6,''GHIa'')
插入tblProductComponentsResult VALUES( 13,7,''JKLa'')
INSERT INTO tblProductComponentsResult VALUES(14,7,''JKLb'')
INSERT INTO tblProductComponentsResult VALUES(15,8,''JKLa'')插入tblProductComponentsResult值(17,9,''JKLa'')
插入tblProductComponentsResult值(18,9,' 'JKLb'')

CREATE TABLE [dbo]。[tblProductsResult](
[UniqueID] [int] NOT NULL PRIMARY KEY,
[Name] [varchar](80 )NULL,
[TagNo] [int] NULL
)[主要]


INSERT INTO tblProductsResult VALUES(1,''ABC1'',55插入tblProductsResult VALUES(2,''DEF'',66)
插入tblProductsResult VALUES(3,''GHI'',77)
INSERT INTO tblProductsResult VALUES(4, ''JKL'',88)
INSERT INTO tblProductsResult VALUES(5,''GHI2'',77)
插入tblProductsResult VALUES(6, 'GHI3'',77)
INSERT INTO tblProductsResult VALUES(7,''JKL2'',88)
INSERT INTO tblProductsResult VALUES(8,''JKL3'',88)
INSERT INTO tblProductsResult VALUES(9,''JKL4'',88)

感谢您对此的帮助。

非常感谢



嗨John,


感谢您的代码。


我运行了您的代码即使代码看起来非常好(一个Insert

语句),它在我的情况下也不起作用。如果你比较我的tblProductsResult

和你的代码生成的结果,那么UniqueIDs是我不能为bblProducts中已有的记录修改的b $ b b值,因为它们是

在其他表中引用了

。我的tblProducts UniqueID 4是JKL,在运行你的代码之后



UniqueID 4是GHI2。这对我来说会有问题。


我也完全忘记在原帖中提到一个更大的问题。

我还需要更新ProductID值在tblProductDetails中

all

在tblProducts中创建的记录。因此,每次在tblProducts中创建新记录

时,我将需要获取新的Identity值

tblProducts

并更新tblProductDetails中的ProductID 。


我也注意到我最初发布的代码没有

产品

''MNO' '对于我的示例示例。


如果有人有兴趣帮助我,那么这里又是全新的代码。

我以为可能有一个这样做的方法是使用一些更新并插入

语句。

我现在怀疑它可能是可能的,但要写得比
$ b $更难b写一下

某种类型的循环记录逐个游标,并且每次只需要一个记录来执行
UPDATE或INSERT语句。


这里是我对样本记录的当前代码:


CREATE DATABASE MyTestDB

GO

使用MyTestDB

GO


CREATE TABLE [db o]。[tblProducts](

[UniqueID] [int] NOT NULL PRIMARY KEY,

[Name] [varchar](80)NULL,

[TagNo] [int] NULL

)ON [PRIMARY]

GO


INSERT INTO tblProducts VALUES(1 ,''ABC'',55)

INSERT INTO tblProducts VALUES(2,''DEF'',66)

INSERT INTO tblProducts VALUES(3,''GHI '',77)

INSERT INTO tblProducts VALUES(4,''JKL'',88)

INSERT INTO tblProducts VALUES(5,''MNO'',99 )


CREATE TABLE [dbo]。[tblProductDetails](

[UniqueID] [int] NOT NULL PRIMARY KEY,

[名称] [varchar](80)NULL,

[ProductID] int

)ON [PRIMARY]

GO


INSERT INTO tblProductDetails VALUES(1,''ABC1'',1)

INSERT INTO tblProductDetails VALUES(2,''DEF'',2)

INSERT INTO tblProductDetails VALUES(3,''GHI'',3)

INSERT INTO tblProductDetail s VALUES(4,''GHI2'',3)

INSERT INTO tblProductDetails VALUES(5,''GHI3'',3)

INSERT INTO tblProductDetails VALUES(6 ,''JKL2'',4)

INSERT INTO tblProductDetails VALUES(7,''JKL'',4)

INSERT INTO tblProductDetails VALUES(8,''JKL3 '',4)

INSERT INTO tblProductDetails VALUES(9,''JKL4'',4)


CREATE TABLE [dbo]。[tblProductComponents](

[UniqueID] [int] NOT NULL PRIMARY KEY,

[ProductID] int,

[Component] [varchar](80)NULL

)ON [PRIMARY]

GO


INSERT INTO tblProductComponents VALUES(1,1,''ABCa'')

INSERT INTO tblProductComponents VALUES(2,1,''ABCb'')

INSERT INTO tblProductComponents VALUES(3,1,''ABCc'')

INSERT INTO tblProductComponents VALUES(4,2,''DEFa'')

INSERT INTO tblProductComponents VALUES(5,2,''DEF b'')

INSERT INTO tblProductComponents VALUES(6,2,''DEFc'')

INSERT INTO tblProductComponents VALUES(7,2,''DEFd'')

INSERT INTO tblProductComponents VALUES(8,3,''GHIa'')

INSERT INTO tblProductComponents VALUES(9,4,''JKLa'')

INSERT INTO tblProductComponents VALUES(10,4,''JKLb'')


CREATE TABLE [dbo]。[tblProductComponentsResult](

[ UniqueID] [int] NOT NULL PRIMARY KEY,

[ProductID] int,

[Component] [varchar](80)NULL

) ON [PRIMARY]

GO


INSERT INTO tblProductComponentsResult VALUES(1,1,''ABCa'')

INSERT INTO tblProductComponentsResult VALUES(2,1,''ABCb'')

INSERT INTO tblProductComponentsResult VALUES(3,1,''ABCc'')

INSERT INTO tblProductComponentsResult VALUES(4 ,2,''DEFa'')

INSERT INTO tblProductComponentsRe sult VALUES(5,2,''DEFb'')

INSERT INTO tblProductComponentsResult VALUES(6,2,''DEFc'')

INSERT INTO tblProductComponentsResult VALUES(7 ,2,''DEFd'')

INSERT INTO tblProductComponentsResult VALUES(8,3,''GHIa'')

INSERT INTO tblProductComponentsResult VALUES(9,4,' 'JKLa'')

INSERT INTO tblProductComponentsResult VALUES(10,4,''JKLb'')

INSERT INTO tblProductComponentsResult VALUES(11,6,''GHIa'' )

INSERT INTO tblProductComponentsResult VALUES(12,7,''GHIa'')

INSERT INTO tblProductComponentsResult VALUES(13,8,''JKLa'')

INSERT INTO tblProductComponentsResult VALUES(14,8,''JKLb'')

INSERT INTO tblProductComponentsResult VALUES(15,9,''JKLa'')

INSERT INTO tblProductComponentsResult VALUES(16,9,''JKLb'')

INSERT INTO tblProductComponentsResult VALU ES(17,10,''JKLa'')

INSERT INTO tblProductComponentsResult VALUES(18,10,''JKLb'')

CREATE TABLE [dbo]。[ tblProductsResult](

[UniqueID] [int] NOT NULL PRIMARY KEY,

[Name] [varchar](80)NULL,

[ TagNo] [int] NULL

)ON [PRIMARY]

GO


INSERT INTO tblProductsResult VALUES(1,''ABC1 '',55)

INSERT INTO tblProductsResult VALUES(2,''DEF'',66)

INSERT INTO tblProductsResult VALUES(3,''GHI'',77 )

INSERT INTO tblProductsResult VALUES(4,''JKL'',88)

INSERT INTO tblProductsResult VALUES(5,''MNO'',99)

INSERT INTO tblProductsResult VALUES(6,''GHI2'',77)

INSERT INTO tblProductsResult VALUES(7,''GHI3'',77)

INSERT INTO tblProductsResult VALUES(8,''JKL2'',88)

INSERT INTO tblProductsResult VALUES(9,''JKL3'',88)

INSERT INTO tblProductsResult VALUES(10,''JKL4'',88)

CREATE TABLE [dbo]。[tblProductDetailsResult](

[UniqueID] [int ] NOT NULL PRIMARY KEY,

[Name] [varchar](80)NULL,

[ProductID] int

)ON [PRIMARY]

GO


INSERT INTO tblProductDetailsResult VALUES(1,''ABC1'',1)

INSERT INTO tblProductDetailsResult VALUES(2 ,''DEF'',2)

INSERT INTO tblProductDetailsResult VALUES(3,''GHI'',3)

INSERT INTO tblProductDetailsResult VALUES(4,''GHI2 '',6)

INSERT INTO tblProductDetailsResult VALUES(5,''GHI3'',7)

INSERT INTO tblProductDetailsResult VALUES(6,''JKL2'',8 )

INSERT INTO tblProductDetailsResult VALUES(7,''JKL'',4)

INSERT INTO tblProductDetailsResult VALUES(8,''JKL3'',9)

INSERT INTO tblProductDetailsResult VALUES(9,''JKL4'',10)

再次感谢

您可以使用sp_rename重命名您的表tblproducts,然后使用类似的东西

INSERT INTO [ dbo]。[tblProducts]([UniqueID],[Name],TagId)
选择(从[dbo]中选择COUNT(*)
。[oldtblProducts] Q
JOIN [dbo]。 tblProductDetails E ON E. [ProductID] = Q. [UniqueID]
WHERE D. [ProductID]> E. [ProductID]
OR(D. [ProductID] = E. [ProductID] AND D.Name> E.Name))+ 1 AS
UniqueID,D.Name,P.TagNo <来自[dbo]。[oldtblProducts] P
JOIN [dbo] .tblProductDetails D ON D. [ProductID] = P. [UniqueID]




你有所有可用的空列,没有DRI可以强制执行

一对多的关系,你说那里没有关系密钥

(IDENTITY是一个公开的物理定位器,并且不能通过

定义来成为关键字)。当表有行时,为什么一直说记录,

哪些是完全不同的东西?

目标是通过为ProductDetails提供第一个匹配名称的名称来更新产品名称<<




如何定义匹配?由于表格没有订购,因此

的作用是第一次。意思? MIN()?如果你有一个真正的钥匙,可以用更新完成。


你的行业有没有标准的零件编号系统?你的

公司是不是使用它或拥有自己的公司?这个问题的经典架构设计

通常看起来更像这样:

CREATE TABLE产品

(product_id INTEGER NOT NULL PRIMARY KEY, - industry std?

product_name VARCHAR(80)NOT NULL, - 真的那么长吗?

tag_nbr INTEGER NOT NULL); - 没有限制?


CREATE TABLE产品详细信息

(product_id INTEGER NOT NULL

参考产品(product_id)

ON UPDATE CASCADE

ON DELETE CASCADE,

detail_name VARCHAR(80)NOT NULL,

PRIMARY KEY(product_id,detail_name) );


CREATE TABLE ProductComponents

(product_id INTEGER NOT NULL

REFERENCES产品(product_id)

ON UPDATE CASCADE

ON DELETE CASCADE,

component_name VARCHAR(80)NOT NULL,

PRIMARY KEY(product_id,component_name));


首先加载产品并删除

课程的IDENTITY列。然后加载引用它的其他表。


I have a scenario where two tables are in a One-to-Many relationship
and I need to move the data from the Many table to the One table so
that it becomes a One-to-One relationship.

I need to salvage the records from the many table and without going
into detail, one of the reasons I can''t do the opposite as
there are records in the ONE table that I need to keep even if they
don''t have any child records in the MANY table.

Below I created the code to create the sample tables:

1- tblProducts is the ONE side table
2- tblProductDetails is the MANY side table
3- tblProductsResult is the RESULT I expect to get after running
some T-SQL code
4- tblProductComponents is another MANY side table to tblProducts
5- tblProductComponentsResult is the RESULT I expect to get...

Some of the points to consider:
6- Normally all UniqueID columns are to be IDENTITY. For
this sample i am entering the UniqueID values myself.
7- I don''t want to create new tables like tblProductsResult
and tblProductComponentsResult. I want to update the real tables.
I have created the tblxxxResult tables only for this post.
8- The goal is to update the name of the Product by giving it the
name of the first matching Name from tblProductDetails.
9- If there are more than one entry in tblProductDetails for each
Product, then I need to create new Products inheriting the original
Product''s information including its child records from tblProductComponents.

If you run the code and open the tables it will be much clearer
to visually see what I want to achieve.

CREATE DATABASE MyTestDB
GO
USE MyTestDB
GO

CREATE TABLE [dbo].[tblProducts] (
[UniqueID] [int] NOT NULL PRIMARY KEY ,
[Name] [varchar] (80) NULL,
[TagNo] [int] NULL
) ON [PRIMARY]
GO

INSERT INTO tblProducts VALUES (1, ''ABC'', 55)
INSERT INTO tblProducts VALUES (2, ''DEF'', 66)
INSERT INTO tblProducts VALUES (3, ''GHI'', 77)
INSERT INTO tblProducts VALUES (4, ''JKL'', 88)

CREATE TABLE [dbo].[tblProductDetails] (
[UniqueID] [int] NOT NULL PRIMARY KEY ,
[Name] [varchar] (80) NULL,
[ProductID] int
) ON [PRIMARY]
GO

INSERT INTO tblProductDetails VALUES (1, ''ABC1'', 1)
INSERT INTO tblProductDetails VALUES (2, ''DEF'', 2)
INSERT INTO tblProductDetails VALUES (3, ''GHI'', 3)
INSERT INTO tblProductDetails VALUES (4, ''GHI2'', 3)
INSERT INTO tblProductDetails VALUES (5, ''GHI3'', 3)
INSERT INTO tblProductDetails VALUES (6, ''JKL2'', 4)
INSERT INTO tblProductDetails VALUES (7, ''JKL'', 4)
INSERT INTO tblProductDetails VALUES (8, ''JKL3'', 4)
INSERT INTO tblProductDetails VALUES (9, ''JKL4'', 4)

CREATE TABLE [dbo].[tblProductComponents] (
[UniqueID] [int] NOT NULL PRIMARY KEY ,
[ProductID] int,
[Component] [varchar] (80) NULL
) ON [PRIMARY]
GO

INSERT INTO tblProductComponents VALUES (1, 1, ''ABCa'')
INSERT INTO tblProductComponents VALUES (2, 1, ''ABCb'')
INSERT INTO tblProductComponents VALUES (3, 1, ''ABCc'')
INSERT INTO tblProductComponents VALUES (4, 2, ''DEFa'')
INSERT INTO tblProductComponents VALUES (5, 2, ''DEFb'')
INSERT INTO tblProductComponents VALUES (6, 2, ''DEFc'')
INSERT INTO tblProductComponents VALUES (7, 2, ''DEFd'')
INSERT INTO tblProductComponents VALUES (8, 3, ''GHIa'')
INSERT INTO tblProductComponents VALUES (9, 4, ''JKLa'')
INSERT INTO tblProductComponents VALUES (10, 4, ''JKLb'')

CREATE TABLE [dbo].[tblProductComponentsResult] (
[UniqueID] [int] NOT NULL PRIMARY KEY ,
[ProductID] int,
[Component] [varchar] (80) NULL
) ON [PRIMARY]
GO

INSERT INTO tblProductComponentsResult VALUES (1, 1, ''ABCa'')
INSERT INTO tblProductComponentsResult VALUES (2, 1, ''ABCb'')
INSERT INTO tblProductComponentsResult VALUES (3, 1, ''ABCc'')
INSERT INTO tblProductComponentsResult VALUES (4, 2, ''DEFa'')
INSERT INTO tblProductComponentsResult VALUES (5, 2, ''DEFb'')
INSERT INTO tblProductComponentsResult VALUES (6, 2, ''DEFc'')
INSERT INTO tblProductComponentsResult VALUES (7, 2, ''DEFd'')
INSERT INTO tblProductComponentsResult VALUES (8, 3, ''GHIa'')
INSERT INTO tblProductComponentsResult VALUES (9, 4, ''JKLa'')
INSERT INTO tblProductComponentsResult VALUES (10, 4, ''JKLb'')
INSERT INTO tblProductComponentsResult VALUES (11, 5, ''GHIa'')
INSERT INTO tblProductComponentsResult VALUES (12, 6, ''GHIa'')
INSERT INTO tblProductComponentsResult VALUES (13, 7, ''JKLa'')
INSERT INTO tblProductComponentsResult VALUES (14, 7, ''JKLb'')
INSERT INTO tblProductComponentsResult VALUES (15, 8, ''JKLa'')
INSERT INTO tblProductComponentsResult VALUES (16, 8, ''JKLb'')
INSERT INTO tblProductComponentsResult VALUES (17, 9, ''JKLa'')
INSERT INTO tblProductComponentsResult VALUES (18, 9, ''JKLb'')
CREATE TABLE [dbo].[tblProductsResult] (
[UniqueID] [int] NOT NULL PRIMARY KEY ,
[Name] [varchar] (80) NULL,
[TagNo] [int] NULL
) ON [PRIMARY]
GO

INSERT INTO tblProductsResult VALUES (1, ''ABC1'', 55)
INSERT INTO tblProductsResult VALUES (2, ''DEF'', 66)
INSERT INTO tblProductsResult VALUES (3, ''GHI'', 77)
INSERT INTO tblProductsResult VALUES (4, ''JKL'', 88)
INSERT INTO tblProductsResult VALUES (5, ''GHI2'', 77)
INSERT INTO tblProductsResult VALUES (6, ''GHI3'', 77)
INSERT INTO tblProductsResult VALUES (7, ''JKL2'', 88)
INSERT INTO tblProductsResult VALUES (8, ''JKL3'', 88)
INSERT INTO tblProductsResult VALUES (9, ''JKL4'', 88)
I appreciate your assistance on this.
Thank you very much

解决方案

Hi

You can rename your table tblproducts using sp_rename then use something
like:

INSERT INTO [dbo].[tblProducts] ( [UniqueID], [Name], TagId )
select (SELECT COUNT(*)
from [dbo].[oldtblProducts] Q
JOIN [dbo].tblProductDetails E ON E.[ProductID] = Q.[UniqueID]
WHERE D.[ProductID] > E.[ProductID]
OR ( D.[ProductID] = E.[ProductID] AND D.Name > E.Name ) ) + 1 AS UniqueID,
D.Name,P.TagNo
from [dbo].[oldtblProducts] P
JOIN [dbo].tblProductDetails D ON D.[ProductID] = P.[UniqueID]

John

"serge" <se****@nospam.ehmail.com> wrote in message
news:mN*********************@wagner.videotron.net. ..

I have a scenario where two tables are in a One-to-Many relationship
and I need to move the data from the Many table to the One table so
that it becomes a One-to-One relationship.

I need to salvage the records from the many table and without going
into detail, one of the reasons I can''t do the opposite as
there are records in the ONE table that I need to keep even if they
don''t have any child records in the MANY table.

Below I created the code to create the sample tables:

1- tblProducts is the ONE side table
2- tblProductDetails is the MANY side table
3- tblProductsResult is the RESULT I expect to get after running
some T-SQL code
4- tblProductComponents is another MANY side table to tblProducts
5- tblProductComponentsResult is the RESULT I expect to get...

Some of the points to consider:
6- Normally all UniqueID columns are to be IDENTITY. For
this sample i am entering the UniqueID values myself.
7- I don''t want to create new tables like tblProductsResult
and tblProductComponentsResult. I want to update the real tables.
I have created the tblxxxResult tables only for this post.
8- The goal is to update the name of the Product by giving it the
name of the first matching Name from tblProductDetails.
9- If there are more than one entry in tblProductDetails for each
Product, then I need to create new Products inheriting the original
Product''s information including its child records from
tblProductComponents.

If you run the code and open the tables it will be much clearer
to visually see what I want to achieve.

CREATE DATABASE MyTestDB
GO
USE MyTestDB
GO

CREATE TABLE [dbo].[tblProducts] (
[UniqueID] [int] NOT NULL PRIMARY KEY ,
[Name] [varchar] (80) NULL,
[TagNo] [int] NULL
) ON [PRIMARY]
GO

INSERT INTO tblProducts VALUES (1, ''ABC'', 55)
INSERT INTO tblProducts VALUES (2, ''DEF'', 66)
INSERT INTO tblProducts VALUES (3, ''GHI'', 77)
INSERT INTO tblProducts VALUES (4, ''JKL'', 88)

CREATE TABLE [dbo].[tblProductDetails] (
[UniqueID] [int] NOT NULL PRIMARY KEY ,
[Name] [varchar] (80) NULL,
[ProductID] int
) ON [PRIMARY]
GO

INSERT INTO tblProductDetails VALUES (1, ''ABC1'', 1)
INSERT INTO tblProductDetails VALUES (2, ''DEF'', 2)
INSERT INTO tblProductDetails VALUES (3, ''GHI'', 3)
INSERT INTO tblProductDetails VALUES (4, ''GHI2'', 3)
INSERT INTO tblProductDetails VALUES (5, ''GHI3'', 3)
INSERT INTO tblProductDetails VALUES (6, ''JKL2'', 4)
INSERT INTO tblProductDetails VALUES (7, ''JKL'', 4)
INSERT INTO tblProductDetails VALUES (8, ''JKL3'', 4)
INSERT INTO tblProductDetails VALUES (9, ''JKL4'', 4)

CREATE TABLE [dbo].[tblProductComponents] (
[UniqueID] [int] NOT NULL PRIMARY KEY ,
[ProductID] int,
[Component] [varchar] (80) NULL
) ON [PRIMARY]
GO

INSERT INTO tblProductComponents VALUES (1, 1, ''ABCa'')
INSERT INTO tblProductComponents VALUES (2, 1, ''ABCb'')
INSERT INTO tblProductComponents VALUES (3, 1, ''ABCc'')
INSERT INTO tblProductComponents VALUES (4, 2, ''DEFa'')
INSERT INTO tblProductComponents VALUES (5, 2, ''DEFb'')
INSERT INTO tblProductComponents VALUES (6, 2, ''DEFc'')
INSERT INTO tblProductComponents VALUES (7, 2, ''DEFd'')
INSERT INTO tblProductComponents VALUES (8, 3, ''GHIa'')
INSERT INTO tblProductComponents VALUES (9, 4, ''JKLa'')
INSERT INTO tblProductComponents VALUES (10, 4, ''JKLb'')

CREATE TABLE [dbo].[tblProductComponentsResult] (
[UniqueID] [int] NOT NULL PRIMARY KEY ,
[ProductID] int,
[Component] [varchar] (80) NULL
) ON [PRIMARY]
GO

INSERT INTO tblProductComponentsResult VALUES (1, 1, ''ABCa'')
INSERT INTO tblProductComponentsResult VALUES (2, 1, ''ABCb'')
INSERT INTO tblProductComponentsResult VALUES (3, 1, ''ABCc'')
INSERT INTO tblProductComponentsResult VALUES (4, 2, ''DEFa'')
INSERT INTO tblProductComponentsResult VALUES (5, 2, ''DEFb'')
INSERT INTO tblProductComponentsResult VALUES (6, 2, ''DEFc'')
INSERT INTO tblProductComponentsResult VALUES (7, 2, ''DEFd'')
INSERT INTO tblProductComponentsResult VALUES (8, 3, ''GHIa'')
INSERT INTO tblProductComponentsResult VALUES (9, 4, ''JKLa'')
INSERT INTO tblProductComponentsResult VALUES (10, 4, ''JKLb'')
INSERT INTO tblProductComponentsResult VALUES (11, 5, ''GHIa'')
INSERT INTO tblProductComponentsResult VALUES (12, 6, ''GHIa'')
INSERT INTO tblProductComponentsResult VALUES (13, 7, ''JKLa'')
INSERT INTO tblProductComponentsResult VALUES (14, 7, ''JKLb'')
INSERT INTO tblProductComponentsResult VALUES (15, 8, ''JKLa'')
INSERT INTO tblProductComponentsResult VALUES (16, 8, ''JKLb'')
INSERT INTO tblProductComponentsResult VALUES (17, 9, ''JKLa'')
INSERT INTO tblProductComponentsResult VALUES (18, 9, ''JKLb'')
CREATE TABLE [dbo].[tblProductsResult] (
[UniqueID] [int] NOT NULL PRIMARY KEY ,
[Name] [varchar] (80) NULL,
[TagNo] [int] NULL
) ON [PRIMARY]
GO

INSERT INTO tblProductsResult VALUES (1, ''ABC1'', 55)
INSERT INTO tblProductsResult VALUES (2, ''DEF'', 66)
INSERT INTO tblProductsResult VALUES (3, ''GHI'', 77)
INSERT INTO tblProductsResult VALUES (4, ''JKL'', 88)
INSERT INTO tblProductsResult VALUES (5, ''GHI2'', 77)
INSERT INTO tblProductsResult VALUES (6, ''GHI3'', 77)
INSERT INTO tblProductsResult VALUES (7, ''JKL2'', 88)
INSERT INTO tblProductsResult VALUES (8, ''JKL3'', 88)
INSERT INTO tblProductsResult VALUES (9, ''JKL4'', 88)
I appreciate your assistance on this.
Thank you very much



Hi John,

Thanks for the code.

I ran your code and even though the code looks very nice (a single Insert
statement), it doesn''t work in my case. If you compare my tblProductsResult
and the result generated by your code, the UniqueIDs are values that I can''t
modify for the already existing records in tblProducts because they are
referenced
in other tables. My tblProducts UniqueID 4 is "JKL", after running your code
the
UniqueID 4 is "GHI2" which would cause problems for me.

I also completely forgot to mention a bigger problem in my original post.
I would also need to update the ProductID values in tblProductDetails for
all
the records that are being created in tblProducts. So everytime a new record
is created in tblProducts I will need to get the new Identity value of
tblProducts
and update the ProductID in tblProductDetails.

I also just noticed the code I had originally posted doesn''t have the
product
''MNO'' for my sample example.

Here''s the whole new code again if anyone is interested to help me out.
I thought there could be a way to do this using a few update and insert
statements.
I suspect now that maybe it is possible but much harder to write than to
write
some type of a looping through the records one by one cursor and do
UPDATE or INSERT statements one record at a time.

Here''s the current code I have for the sample records:

CREATE DATABASE MyTestDB
GO
USE MyTestDB
GO

CREATE TABLE [dbo].[tblProducts] (
[UniqueID] [int] NOT NULL PRIMARY KEY ,
[Name] [varchar] (80) NULL,
[TagNo] [int] NULL
) ON [PRIMARY]
GO

INSERT INTO tblProducts VALUES (1, ''ABC'', 55)
INSERT INTO tblProducts VALUES (2, ''DEF'', 66)
INSERT INTO tblProducts VALUES (3, ''GHI'', 77)
INSERT INTO tblProducts VALUES (4, ''JKL'', 88)
INSERT INTO tblProducts VALUES (5, ''MNO'', 99)

CREATE TABLE [dbo].[tblProductDetails] (
[UniqueID] [int] NOT NULL PRIMARY KEY ,
[Name] [varchar] (80) NULL,
[ProductID] int
) ON [PRIMARY]
GO

INSERT INTO tblProductDetails VALUES (1, ''ABC1'', 1)
INSERT INTO tblProductDetails VALUES (2, ''DEF'', 2)
INSERT INTO tblProductDetails VALUES (3, ''GHI'', 3)
INSERT INTO tblProductDetails VALUES (4, ''GHI2'', 3)
INSERT INTO tblProductDetails VALUES (5, ''GHI3'', 3)
INSERT INTO tblProductDetails VALUES (6, ''JKL2'', 4)
INSERT INTO tblProductDetails VALUES (7, ''JKL'', 4)
INSERT INTO tblProductDetails VALUES (8, ''JKL3'', 4)
INSERT INTO tblProductDetails VALUES (9, ''JKL4'', 4)

CREATE TABLE [dbo].[tblProductComponents] (
[UniqueID] [int] NOT NULL PRIMARY KEY ,
[ProductID] int,
[Component] [varchar] (80) NULL
) ON [PRIMARY]
GO

INSERT INTO tblProductComponents VALUES (1, 1, ''ABCa'')
INSERT INTO tblProductComponents VALUES (2, 1, ''ABCb'')
INSERT INTO tblProductComponents VALUES (3, 1, ''ABCc'')
INSERT INTO tblProductComponents VALUES (4, 2, ''DEFa'')
INSERT INTO tblProductComponents VALUES (5, 2, ''DEFb'')
INSERT INTO tblProductComponents VALUES (6, 2, ''DEFc'')
INSERT INTO tblProductComponents VALUES (7, 2, ''DEFd'')
INSERT INTO tblProductComponents VALUES (8, 3, ''GHIa'')
INSERT INTO tblProductComponents VALUES (9, 4, ''JKLa'')
INSERT INTO tblProductComponents VALUES (10, 4, ''JKLb'')

CREATE TABLE [dbo].[tblProductComponentsResult] (
[UniqueID] [int] NOT NULL PRIMARY KEY ,
[ProductID] int,
[Component] [varchar] (80) NULL
) ON [PRIMARY]
GO

INSERT INTO tblProductComponentsResult VALUES (1, 1, ''ABCa'')
INSERT INTO tblProductComponentsResult VALUES (2, 1, ''ABCb'')
INSERT INTO tblProductComponentsResult VALUES (3, 1, ''ABCc'')
INSERT INTO tblProductComponentsResult VALUES (4, 2, ''DEFa'')
INSERT INTO tblProductComponentsResult VALUES (5, 2, ''DEFb'')
INSERT INTO tblProductComponentsResult VALUES (6, 2, ''DEFc'')
INSERT INTO tblProductComponentsResult VALUES (7, 2, ''DEFd'')
INSERT INTO tblProductComponentsResult VALUES (8, 3, ''GHIa'')
INSERT INTO tblProductComponentsResult VALUES (9, 4, ''JKLa'')
INSERT INTO tblProductComponentsResult VALUES (10, 4, ''JKLb'')
INSERT INTO tblProductComponentsResult VALUES (11, 6, ''GHIa'')
INSERT INTO tblProductComponentsResult VALUES (12, 7, ''GHIa'')
INSERT INTO tblProductComponentsResult VALUES (13, 8, ''JKLa'')
INSERT INTO tblProductComponentsResult VALUES (14, 8, ''JKLb'')
INSERT INTO tblProductComponentsResult VALUES (15, 9, ''JKLa'')
INSERT INTO tblProductComponentsResult VALUES (16, 9, ''JKLb'')
INSERT INTO tblProductComponentsResult VALUES (17, 10, ''JKLa'')
INSERT INTO tblProductComponentsResult VALUES (18, 10, ''JKLb'')
CREATE TABLE [dbo].[tblProductsResult] (
[UniqueID] [int] NOT NULL PRIMARY KEY ,
[Name] [varchar] (80) NULL,
[TagNo] [int] NULL
) ON [PRIMARY]
GO

INSERT INTO tblProductsResult VALUES (1, ''ABC1'', 55)
INSERT INTO tblProductsResult VALUES (2, ''DEF'', 66)
INSERT INTO tblProductsResult VALUES (3, ''GHI'', 77)
INSERT INTO tblProductsResult VALUES (4, ''JKL'', 88)
INSERT INTO tblProductsResult VALUES (5, ''MNO'', 99)
INSERT INTO tblProductsResult VALUES (6, ''GHI2'', 77)
INSERT INTO tblProductsResult VALUES (7, ''GHI3'', 77)
INSERT INTO tblProductsResult VALUES (8, ''JKL2'', 88)
INSERT INTO tblProductsResult VALUES (9, ''JKL3'', 88)
INSERT INTO tblProductsResult VALUES (10, ''JKL4'', 88)
CREATE TABLE [dbo].[tblProductDetailsResult] (
[UniqueID] [int] NOT NULL PRIMARY KEY ,
[Name] [varchar] (80) NULL,
[ProductID] int
) ON [PRIMARY]
GO

INSERT INTO tblProductDetailsResult VALUES (1, ''ABC1'', 1)
INSERT INTO tblProductDetailsResult VALUES (2, ''DEF'', 2)
INSERT INTO tblProductDetailsResult VALUES (3, ''GHI'', 3)
INSERT INTO tblProductDetailsResult VALUES (4, ''GHI2'', 6)
INSERT INTO tblProductDetailsResult VALUES (5, ''GHI3'', 7)
INSERT INTO tblProductDetailsResult VALUES (6, ''JKL2'', 8)
INSERT INTO tblProductDetailsResult VALUES (7, ''JKL'', 4)
INSERT INTO tblProductDetailsResult VALUES (8, ''JKL3'', 9)
INSERT INTO tblProductDetailsResult VALUES (9, ''JKL4'', 10)
Thanks again

You can rename your table tblproducts using sp_rename then use something
like:

INSERT INTO [dbo].[tblProducts] ( [UniqueID], [Name], TagId )
select (SELECT COUNT(*)
from [dbo].[oldtblProducts] Q
JOIN [dbo].tblProductDetails E ON E.[ProductID] = Q.[UniqueID]
WHERE D.[ProductID] > E.[ProductID]
OR ( D.[ProductID] = E.[ProductID] AND D.Name > E.Name ) ) + 1 AS UniqueID, D.Name,P.TagNo
from [dbo].[oldtblProducts] P
JOIN [dbo].tblProductDetails D ON D.[ProductID] = P.[UniqueID]




You have NULL-able columns for everything, no DRI to enforce the
1-to-many relationship you say is there and no relational keys
(IDENTITY is an exposed physical locator and cannot be a key by
definition). Why do keep saying "records", when a table has rows,
which are completely different things?

The goal is to update the name of the Product by giving it the name of the first matching Name from ProductDetails <<



How do you define this matching? Since tables have no ordering what
does "first" mean? MIN()? That coudl be done with a UPDATE if you had
real keys.

Doesn''t your industry have a standard part number system? Doesn''t your
company use it or have one of their own? The classic schema design
for this problem usually looks more like this:

CREATE TABLE Products
(product_id INTEGER NOT NULL PRIMARY KEY, -- industry std?
product_name VARCHAR (80) NOT NULL, -- really that long?
tag_nbr INTEGER NOT NULL); -- no constraints?

CREATE TABLE ProductDetails
(product_id INTEGER NOT NULL
REFERENCES Products (product_id)
ON UPDATE CASCADE
ON DELETE CASCADE,
detail_name VARCHAR(80) NOT NULL,
PRIMARY KEY (product_id, detail_name));

CREATE TABLE ProductComponents
(product_id INTEGER NOT NULL
REFERENCES Products (product_id)
ON UPDATE CASCADE
ON DELETE CASCADE,
component_name VARCHAR(80) NOT NULL,
PRIMARY KEY (product_id, component_name));

Begin by loading Products and get rid of the IDENTITY column, of
course. Then load the other tables that reference it.


这篇关于UPDATE / INSERT使一对多表成为一对一的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆