SQL基于表C从表B插入表A中

时间:2013-12-27 19:10:45

标签: sql insert db2

我有一个空表,我想填充第二个表中的行,基于第三个表,我分别称它们为A,B,C。

表C的ID号与表B中的行ID号相匹配。对于表C中的每个ID,我想将表B中的相应行添加到表A中。

这就是我所拥有的,我收到一个错误,说我不能使用最后一个声明。

INSERT INTO TABLEA              
  SELECT * FROM TABLEB     
  WHERE ID FROM TABLEB = ID FROM TABLEC;

DSNT408I SQLCODE = -199, ERROR:  ILLEGAL USE OF KEYWORD FROM.  TOKEN ( . AT  
         MICROSECONDS MICROSECOND SECONDS SECOND MINUTES MINUTE WAS EXPECTED 
DSNT418I SQLSTATE   = 42601 SQLSTATE RETURN CODE          

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:2)

INSERT INTO TableA
    SELECT B.*
      FROM TableB AS B
      JOIN TableC AS C ON B.ID = C.ID

或者可能会给你太多重复(如果C中有多行与B中的给定行匹配),在这种情况下你可能需要:

INSERT INTO TableA
    SELECT B.*
      FROM TableB AS B
     WHERE B.ID IN (SELECT C.ID FROM TableC AS C)

或者:

INSERT INTO TableA
    SELECT DISTINCT B.*
      FROM TableB AS B
      JOIN TableC AS C ON B.ID = C.ID

对于B中与C中的一行或多行匹配的每行,这两行都会在A中为您提供一行。


  

我如何为此添加WHEN子句?假设表C有另一个名为VALUE的列,我想添加值为'x'或更大的所有ID号。我怎么做,我尝试添加JOIN TableC AS C ON B.ID = C.ID AND C.VALUE > 5,但我仍然得到了表C中的所有值。

使用第一个查询(将其他查询保留为“读者练习”),那么我认为你应该做的只是:

INSERT INTO TableA
    SELECT B.*
      FROM TableB AS B
      JOIN TableC AS C ON B.ID = C.ID
     WHERE C.Value > 5

优化器应将其转换为等效表达式:

INSERT INTO TableA
    SELECT B.*
      FROM TableB AS B
      JOIN TableC AS C ON B.ID = C.ID AND C.Value > 5

我不清楚您的评论是否以某种方式在一个查询中添加了对TableC的第二个引用,或者您修改了查询,如第二个示例所示。如果你没有在任何地方使用LEFT JOIN,那么将AND C.Value > 5项添加到ON子句或作为WHERE子句应该已经产生了正确的数据。

在调试这类问题时,值得注意的是,这个INSERT语句中有一个非常好的SELECT语句,您可以自己运行它来查看将要添加到TableA的内容。您可能希望扩充选择列表以包含(至少)C.IDC.Value,以确保没有任何事情发生错误。