SQLITE,创建一个临时表,然后从中进行选择

时间:2018-04-30 04:03:36

标签: sqlite

只是想知道如何创建一个临时表,然后从脚本中进一步选择它。

实施例。

CREATE TEMPORARY TABLE TEMP_TABLE1 AS 
Select 
L.ID,
SUM(L.cost)/2 as Costs,
from Table1 L
JOIN Table2 C on L.ID = C.ID
Where C.name  = 'mike'
Group by L.ID



Select 
Count(L.ID)
from Table1 L
JOIN TEMP_TABLE1 TT1 on L.ID = TT1.ID;
Where L.ID not in (TT1) 
And Sum(L.Cost) > TT1.Costs

理想情况下,我想要一个临时表,然后在脚本中使用它来引用。

任何帮助都会很棒!

1 个答案:

答案 0 :(得分:5)

只有当表格是唯一的表名时,您才会将表格称为 temp.<table> <table> 后者。

按照: -

  

如果指定了模式名称,则它必须是“main”,“temp”或   附加数据库的名称。在这种情况下,新表是   在指定的数据库中创建。如果是“TEMP”或“TEMPORARY”关键字   在“CREATE”和“TABLE”之间发生,然后创建新表   在临时数据库中。指定模式名称和。是错误的   TEMP或TEMPORARY关键字,除非schema-name是“temp”。如果不   指定了模式名称,然后TEMP关键字不存在   table在主数据库中创建。

SQL As Understood By SQLite - CREATE TABLE

以下示例创建3个表: -

  1. table1,其中3列为永久表。
  2. table1永久table1的临时副本。
  3. temp_table永久table1的另一个临时副本。
  4. : -

    DROP TABLE IF EXISTS temp.table1;
    DROP TABLE IF EXISTS table1;
    DROP TABLE IF EXISTS temp_table;
    CREATE TABLE table1 (columnA INTEGER,columnB INTEGER, columnC INTEGER);
    
    1. 创建永久表1时,它加载了4行
    2. : -

      INSERT INTO table1 (columnA,columnB,columnC) VALUES 
       (1,5,20),
       (2,7,21),
       (3,8,80),
       (4,3,63);
      CREATE TEMP TABLE table1 AS select * from table1;;
      CREATE TEMPORARY TABLE temp_table AS SELECT * FROM table1;
      
      1. 然后将两个临时表用于联合所有基本上复制行,但将源表的指示符作为新列from_table
        1. 不是使用两种形式的临时表。 temp. ,只是表名。
        2. 后者只有在临时表是唯一的表名时才可用。
      2. : -

        SELECT 'temp_table' AS from_table,* FROM temp_table
        UNION ALL 
        SELECT 'temp.table1' as from_table,* FROM temp.table1;
        

        结果是: -

        enter image description here

        重新添加示例: -

        CREATE TEMPORARY TABLE TEMP_TABLE1 AS 
        Select 
        L.ID,
        SUM(L.cost)/2 as Costs,
        from Table1 L
        JOIN Table2 C on L.ID = C.ID
        Where C.name  = 'mike'
        Group by L.ID
        
        
        
        Select 
        Count(L.ID)
        from Table1 L
        JOIN TEMP_TABLE1 TT1 on L.ID = TT1.ID;
        Where L.ID not in (TT1) 
        And Sum(L.Cost) > TT1.Costs
        

        此示例中存在一些问题,即滥用聚合(注释掉)以下工作。

        • 注意为方便起见,我在表格名称中添加了 _

        : -

        DROP TABLE IF EXISTS Table_1;
        DROP TABLE IF EXISTS Table_2;
        DROP TABLE If EXISTS temp.temp_table1;
        CREATE TABLE Table_1 (ID INTEGER PRIMARY KEY, cost REAL);
        CREATE TABLE Table_2 (ID INTEGER PRIMARY KEY, name TEXT);
        INSERT INTO Table_1 (cost) VALUES (100.45),(56.78),(99.99);
        INSERT INTO Table_2 (name) VALUES ('mike'),('mike'),('fred');
        
        CREATE TEMP TABLE temp_table1 AS
        SELECT L.ID, 
            sum(L.cost)/2 as Costs
        FROM Table_1 L
            JOIN Table_2 C ON L.ID = C.ID
        WHERE C.name = 'mike'
        GROUP BY L.ID;
        
        SELECT 
            count(L.ID)
        FROM Table_1 L
           JOIN temp_table1 TT1 ON  L.ID = TT1.[L.ID]
        WHERE 
            L.ID NOT IN (TT1.[L.ID])
            -- AND Sum(L.cost) > TT1.costs --<<<< misuse of aggregate
        

        问题基于列名称 L.ID ,因此必须附上(此处的规则SQL As Understood By SQLite - SQLite Keywords适用) [ ]

        • 当然,您可以通过使用 AS e..g SELECT L.ID AS lid, --<<<< AS lid ADDED SUM(L.cost)/2 as Costs, ,.......
        • 命名列来避免对机箱的需求

        添加以下内容可能适合绕过滥用聚合: -

        GROUP BY L.ID
        HAVING sum(L.cost) > TT1.costs
        

        将以下内容添加到脚本的末尾: -

         SELECT 
            count(L.ID), *
        FROM Table_1 L
           JOIN temp_table1 TT1 ON  L.ID = TT1.[L.ID];
        

        导致: -

        enter image description here