【问题标题】:Insert Multiple Rows SQL Teradata插入多行 SQL Teradata
【发布时间】:2017-02-01 18:13:04
【问题描述】:

我正在创建一个易失性表并尝试向表中插入行。我可以像下面这样上传一行...


create volatile table Example
(
    ProductID VARCHAR(15),
    Price DECIMAL (15,2)
)
on commit preserve rows;
et;

INSERT INTO Example
Values
('Steve',4);

但是,当我尝试上传多个时出现错误:

“语法错误:预期在 ')' 和 ',' 之间。”

INSERT INTO Example
Values
('Steve',4),
('James',8);

【问题讨论】:

    标签: sql teradata sql-insert


    【解决方案1】:

    正如 Gordon 所说,Teradata 不支持具有多行的 VALUES(UNION ALL 会因为缺少 FROM 而失败。

    您可以改用多语句请求 (MSR):

    INSERT INTO Example Values('Steve',4)
    ;INSERT INTO Example Values('James',8)
    ;
    

    如果是 BTEQ 作业,则插入作为最后一个分号后的一个块提交(当有一个新命令从同一行开始时,它是 MSR 的一部分)。在 SQL 助手或 Studio 中,您必须使用 F9 而不是 F5 提交它。

    【讨论】:

      【解决方案2】:

      我认为 Teradata 不支持多行 values 语法。只需使用select

      INSERT INTO Example(ProductId, Price)
      WITH dual as (SELECT 1 as x)
          SELECT 'Steve' as ProductId, 4 as Price FROM dual UNION ALL
          SELECT 'James' as ProductId, 8 as Price FROM dual;
      

      【讨论】:

      • 这会引发语法错误。请看看我的 CTE 答案。
      • 这里也有语法错误 - WITH 似乎需要位于 INSERT 行和第一个 SELECT 之间。
      【解决方案3】:

      CTE 语法(工作):

      insert into target_table1 (col1, col2)
      with cte as (select 1 col1)
      select 'value1', 'value2' from cte
      union all
      select 'value1a', 'value2a' from cte
      ;
      

      CTE 语法在 Teradata 中不起作用 (错误:预期在“)”和“插入”关键字之间)

      with cte as (select 1 col1)
      insert into target_table1 (col1, col2)
      select 'value1', 'value2' from cte
      union all
      select 'value1a', 'value2a' from cte
      ;
      

      【讨论】:

      • 尝试了第二个,没用,TD v16.20,错误:预期在“)”和“插入”关键字之间有一些东西),如答案中所述。
      【解决方案4】:

      我通过 RECURSIVE 找到了解决方案。它是这样的:-

      INSERT INTO table (col1, col2)
      with recursive table (col1, col2) as 
      (select 'val1','val2' from table)  -- 1
      select 'val1','val2' from table    -- 2
      union all select 'val3','val4' from table
      union all select 'val5','val6' from table;
      

      没有插入第 1 行的数据(但您需要这一行)。从第 2 行开始,您为 val1、val2 等输入的数据将插入到相应的列中。使用尽可能多的 UNION ALLs' 尽可能多的行来插入。希望这会有所帮助:)

      【讨论】:

        【解决方案5】:

        至少在我们的 Teradata 版本中,我们不能使用带有 CTE 的插入语句。相反,找到一张真正的桌子(最好是小尺寸的)并做一个前1名。

        Insert Into OtherRealTable(x, y)
        Select top 1
           'x' as x, 
           'y' as y
        FROM RealTable
        

        【讨论】:

          【解决方案6】:
          create table dummy as (select '1' col1) with data;
          
          INSERT INTO Student
              (Name, Maths, Science, English)
          SELECT 'Tilak', 90, 40, 60 from dummy union 
          SELECT  'Raj', 30, 20, 10 from dummy
          ;
          

          【讨论】:

            【解决方案7】:

            是的,你可以试试这个。

            INSERT INTO  Student 
              SELECT (Name, Maths, Science, English)  FROM JSON_Table 
                    (ON (SELECT 1 id,cast('{"DataSet" : [
            {"s":"m", "Name":"Tilak", "Maths":"90","Science":"40", "English":"60" },   
            {"s":"m", "Name":"Raj", "Maths":"30","Science":"20", "English":"10" }
            ]
            }' AS json ) jsonCol)
            USING rowexpr('$.DataSet[*]')
            colexpr('[{"jsonpath":"$.s","type":"CHAR(1)"},{"jsonpath":"$.Name","type":"VARCHAR(30)"}, {"jsonpath":"$.Maths","type":"INTEGER"}, {"jsonpath":"$.Science","type":"INTEGER"}, {"jsonpath":"$.English","type":"INTEGER"}]')
            ) AS JT(id,State,Name, Maths, Science, English) 
            

            【讨论】:

            • Nice :-) 但是如果 Teradata 最终支持完整的 VALUES 语法会不会容易得多?
            • 是的,你是对的!如果您必须处理放置在 Teradata 前面的 Unity,情况会变得更糟,许多功能和语法不再起作用......真正的心理剧...... ;-)
            猜你喜欢
            • 2016-05-10
            • 1970-01-01
            • 2013-11-23
            • 2012-09-04
            • 1970-01-01
            • 2019-02-05
            • 2019-07-04
            • 1970-01-01
            相关资源
            最近更新 更多