我有一个空表,我想填充第二个表中的行,基于第三个表,我分别称它们为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
任何帮助都将不胜感激。
答案 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.ID
和C.Value
,以确保没有任何事情发生错误。