UPDATE / INSERT使一对多表成为一对一

编程入门 行业动态 更新时间:2024-10-28 09:21:27
本文介绍了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>在消息中写道 新闻:mN ********************* @ wagner.videotron。 ..

我有一个场景,其中两个表是一对多的关系我需要将数据从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> wrote in message news:mN*********************@wagner.videotron. ..

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使一对多表成为一对一

本文发布于:2023-10-26 14:38:19,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1530435.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:UPDATE   INSERT

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!