【问题标题】:SQLite CREATE TABLE AS but rename columns and keep original data types, keys?SQLite CREATE TABLE AS 但重命名列并保留原始数据类型、键?
【发布时间】:2018-03-02 19:23:23
【问题描述】:

SQLite 目标

我想从一个连接(或一系列连接/子查询)创建一个新表。我希望新表保留原始表中的数据类型以及唯一索引。

另外,我想重命名过程中的一些列。要在 SQLite 中执行此操作,我的印象是需要执行以下步骤:

  1. 将连接表创建为临时表
  2. 使用所需的列名、数据类型和索引创建一个空的新表
  3. 将临时表插入到新表中。

问题:有没有更好或更简洁的方法来完成这项任务?

上述流程的代码示例:

--create joined table as tmp
DROP TABLE if exists tmp;

CREATE TABLE tmp AS
SELECT 
    individual_contributions.cmte_id, 
    cmte_pty_affiliation, 
    name, 
    employer, 
    transaction_dt,
    transaction_amt,
    file_num,
    cand_id,
    sub_id 
    FROM individual_contributions LEFT JOIN committee_master 
    ON individual_contributions.cmte_id=committee_master.cmte_id
    WHERE employer LIKE "Goldman Sachs"
    GROUP BY sub_id;
--create new table with desired specs
DROP TABLE if exists cm_indiv;

CREATE TABLE cm_indiv (
    cmte_id TEXT NOT NULL,
    cmte_pty_affiliation TEXT,
    contributor_name TEXT,
    contributor_employer TEXT,
    contributor_transaction_dt TEXT,
    cand_id TEXT,
    transaction_amt TEXT,
    file_num NUMERIC,
    sub_id NUMERIC NOT NULL
);

CREATE UNIQUE INDEX idx_cm_indiv ON cm_indiv (sub_id);
--insert joined table into new table
INSERT INTO cm_indiv (
    cmte_id,
    cmte_pty_affiliation,
    contributor_name,
    contributor_employer,
    contributor_transaction_dt,
    cand_id,
    transaction_amt,
    file_num,
    sub_id
    )
SELECT 
    cmte_id,
    cmte_pty_affiliation,
    name,
    employer,
    transaction_dt,
    cand_id,
    transaction_amt,
    file_num,
    sub_id
    FROM tmp;

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    此 CTAS 使用 SQL Fiddle (SQLite-WebSQL) 为我工作。因此,当您创建表时,请在 select 语句中使用首选列名,如下所示。

    create table tbl( id int);
    
    insert into tbl values (1);
    
    create table new_tbl 
    as 
    select id as new_id 
    from tbl;
    
    select new_id from new_tbl;
    
    Result: 
    new_id
    1
    

    【讨论】:

      【解决方案2】:

      先新建表,然后直接插入joined数据:

      CREATE TABLE cm_indiv ( cmte_id TEXT NOT NULL, ...);
      
      INSERT INTO cm_indiv(...) SELECT ... FROM ... JOIN ...;
      
      CREATE INDEX ...;
      

      【讨论】:

        猜你喜欢
        • 2013-12-27
        • 2018-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多