【问题标题】:SQL Server: Extracting a Column Into a TableSQL Server:将列提取到表中
【发布时间】:2010-10-30 20:01:28
【问题描述】:

我有一个表,其中有一列我想提取出来并放入一个单独的表中。

例如,假设我有一个名为 Contacts 的表。 Contacts 有一个名为 Name 的列,其中存储了一个字符串。现在我想将名称提取到另一个名为 Name 的表中,并将 Contact.Name 列链接到 Name 表的 Id。

我只能使用 SQL 来执行此操作。关于解决此问题的最佳方法的任何想法?

如果我能澄清任何事情,请告诉我,谢谢!

[编辑] 一个问题是不同的联系人可以绑定到同一个名字。因此,当不同的联系人具有相同的名称并且它被导出时,名称表将只有一个唯一的行用于该名称,并且所有联系人都将指向该行。我想如果我实际上是在编写通讯录,这将没有意义,但我只是用它来说明我的问题。

【问题讨论】:

  • 请记住,同名不是同一个联系人,因为许多人有相同的名字。并且名称几乎不应该是一个字段。当您在同一个表中拥有像“Smith III, Steve”和 Steve A. Smith 这样的数据作为 name 时,您如何高效或有效地搜索所有 Steve Smith?
  • 对,如果我真的在写通讯录,我就不得不考虑这一点。但是,我只是将其用作插图。我正在研究的解决方案实际上与联系人无关。否则很好考虑。

标签: sql sql-server tsql ddl dml


【解决方案1】:

使用指向联系人表的外键创建新表。然后将联系人表中的姓名和联系人 ID 插入到这个新表中。之后,您可以从联系人表中删除“名称”列。

CREATE TABLE Name
(
   ContactId int,
   Name nvarchar(100)
);

INSERT Name(Name)
SELECT ContactId, Name From Contact;

ALTER TABLE Contact
DROP Column name;

编辑:由于您已编辑问题以提及一个姓名可以与多个联系人相关联,因此这会以相反的方式改变事情。

CREATE TABLE Name
(
   NameId int IDENTITY,
   Name nvarchar(100)
);

INSERT Name(Name)
SELECT DISTINCT Name From Contact;

ALTER TABLE Contact
ADD NameId int;

UPDATE c
SET c.NameId = n.NameId
FROM Contact c
JOIN Name n on n.Name = c.Name;

ALTER Table Contact
Drop Column Name;

注意:确保使用 Contact 表上的 NameId 在 Contact 和 Name 表之间创建适当的外键,并在 Name 表中的“name”列上创建 UNIQUE 约束.

【讨论】:

  • 一个小的易读性问题,您不需要 [Name] 周围的括号
  • 我认为 Dave 想要的链接反过来。
【解决方案2】:
ALTER TABLE `Contacts` ADD `name_id` INT( 12 ) NOT NULL 
ALTER TABLE `Name` ADD `Name` VARCHAR( 200 ) NOT NULL 
INSERT INTO Name (id, name) SELECT id, Name FROM Contacts
ALTER TABLE `Contacts` DROP `Name`

问题是name_id 字段,它用“0”填充,并且应该与Contacts-Table 中的id 具有相同的值。在这里您可以使用LOOP 或ITERATE 语句(如果您使用MySQL)。

【讨论】:

    【解决方案3】:

    insert into new_table (contact_id, name) select min(id), name from contacts group by name;

    这是确保每个名称只有一行的一种方法 - 您可以用其他函数替换 min(例如 max)。

    不过,我不太确定您为什么要这样做。无论如何,你最终会得到一些没有名字链接的联系人......

    【讨论】:

      【解决方案4】:
      CREATE TABLE Name (NameID int IDENTITY(1, 1), [Name] varchar(50))
      
      INSERT INTO Name ([Name])
      SELECT DISTINCT [Name]
      FROM Contact
      
      ALTER TABLE Contact
          ADD COLUMN NameID int
      
      UPDATE Contact
      SET NameID = [Name].NameID
      FROM Contact
      INNER JOIN [Name]
          ON Contact.[Name] = [Name].[Name]
      
      ALTER TABLE Contact
          DROP COLUMN [Name]
      

      然后添加外键约束等

      【讨论】:

        【解决方案5】:
        insert into another_table( contact_id, name )
        select id, name 
        from contacts;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-10-07
          • 1970-01-01
          • 2020-01-23
          • 1970-01-01
          • 2019-10-02
          • 1970-01-01
          • 2015-09-28
          • 2023-04-02
          相关资源
          最近更新 更多