允许从重复记录中的一条记录到具有主键的表中

Posted

技术标签:

【中文标题】允许从重复记录中的一条记录到具有主键的表中【英文标题】:Allow one record from duplicated records into table with primary key 【发布时间】:2020-09-10 21:48:55 【问题描述】:

我需要你的帮助来完成这个请求:

我有这样的观点 (My_Class):

Name      Class     Color
----------------------------
Albert      A       Blue
John        B       Yellow
Albert      A       White
Gina        A       Grey

我想将此数据插入到具有这种结构的 SQL Server 表 (Name_Class) 中:

名称 Varchar(10) 主键 类 Varchar(2)

运行以下查询时:

INSERT INTO [dbo].[Name_Class] (NAME, CLASS)
SELECT NAME, CLASS
FROM My_Class;

我收到以下错误:

违反主键约束“PK_NAME”。无法在对象“dbo.Name_Class”中插入重复键。重复键值为 (Albert)

问题:是否可以创建一个查询以仅包含一条 Albert 记录(任何),并将 Name 作为主键?

Name_Class(期望的结果):

Albert  A
John    B
Gina    C

提前感谢您的帮助

【问题讨论】:

【参考方案1】:

你想要聚合吗?

INSERT INTO [dbo].[Name_Class] (NAME, CLASS)
SELECT NAME, MAX(CLASS)
FROM My_Class
GROUP BY NAME;

这保证每个name 一行,符合目标表的主键。如果一个名称有多个类,则保留最大的类。

【讨论】:

【参考方案2】:

您可以使用 GROUP BY,但是当 Names 不是 uinque 时,您总是会遇到问题

CREATE TABLE My_Class (
  [Name] VARCHAR(7),
  [Class] VARCHAR(4),
  [Color] VARCHAR(6)
);

INSERT INTO My_Class ([Name], [Class], [Color])
VALUES
  ('Albert', 'A', 'Blue'),
  ('John', 'B', 'Yellow'),
  ('Albert', 'A', 'White'),
  ('Gina', 'A', 'Grey');
GO
4 行受影响
SELECT [Name], [Class] FROM My_Class GROUP BY [Name], [Class]
GO
姓名 |班级 :----- | :---- 阿尔伯特 |一种 吉娜 |一种 约翰 |乙

db小提琴here

【讨论】:

【参考方案3】:

你可以使用 DISTINCT。

INSERT INTO [dbo].[Name_Class] (NAME, CLASS)
SELECT DISTINCT NAME, CLASS
FROM My_Class;

【讨论】:

以上是关于允许从重复记录中的一条记录到具有主键的表中的主要内容,如果未能解决你的问题,请参考以下文章

具有新主键的重复记录 (VBA)

主键和外键的区别:

怎么删除ACCESS中的重复记录 只保留一条

请问SQL server 中的主键和外键的作用

2.2主键介绍

SQL中主键和外键的定义是啥???