【问题标题】: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

提前感谢您的帮助

【问题讨论】:

    标签: sql sql-server tsql sql-insert


    【解决方案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;
        

        【讨论】:

          猜你喜欢
          • 2023-03-27
          • 1970-01-01
          • 2011-01-14
          • 1970-01-01
          • 1970-01-01
          • 2010-11-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多