在我的Ms Access中,我想从两个不同的表中插入数据,所以我写这样的sql:
SELECT B.*, C.* INTO Table2 FROM Table1 AS A
RIGHT JOIN ABC AS B ON A.HKID=B.HKID
RIGHT JOIN DEF AS C ON A.HKID=C.HKID
WHERE A.HKID Is Null and b.organization not like '*xxx*' and b.adj = 1 and c.[Status] = 'Suspend';"
但运行sql时出现错误信息,表示语法错误。
我可以像这样编写sql吗?
答案 0 :(得分:1)
当您有多个JOIN
时,Access'db引擎需要使用括号。
SELECT B.*, C.* INTO Table2
FROM
(Table1 AS A RIGHT JOIN ABC AS B ON A.HKID = B.HKID)
RIGHT JOIN DEF AS C ON B.HKID = C.HKID
WHERE
A.HKID Is Null
AND B.organization Not Like '*xxx*'
AND B.adj=1
AND C.Status='Suspend';
注意我用过......
RIGHT JOIN DEF AS C ON B.HKID = C.HKID
而不是你拥有它的方式......
RIGHT JOIN DEF AS C ON A.HKID=C.HKID
我必须进行更改,因为当我尝试ON A.HKID=C.HKID
时,Access抱怨“加入不支持”如果不满意,则需要重新开始;我想我会用相反的顺序处理这个表并使用LEFT JOIN
。
此外,您创建的表格(Table2
)将包含名为B_HKID
和C_HKID
的字段,这些字段来自B.HKID
和C.HKID
。您将看到与这两个表共有的任何其他字段名称相同的模式。如果这是不可接受的,您可以单独列出字段并在需要时指定别名。
如果安装了Access,则应在查询设计器中构建此查询,因为它将确保您正确设置连接以保持数据库引擎满意。
如果您没有安装Access,并且您正在从ADO连接运行此查询,请将Like
字符串模式中的通配符字符从*
更改为%
。
AND B.organization Not Like '%xxx%'
答案 1 :(得分:0)
该代码不正确
INSERT INTO TABLE2
SELECT B.*, C.* FROM TABLEA AS A
RIGHT JOIN ABC AS B ON A.HKID=B.HKID
RIGHT JOIN DEF AS C ON A.HKID=C.HKID
WHERE A.HKID IS NULL and B.ORGANIZATION NOT LIKE '*xxx*' AND B.ADJ = 1 AND C.[STATUS] = 'SUSPEND';
希望你知道正确的联合。你所说的是从C和B返回所有记录,无论它是否与A匹配。但我想你的位置会减少它,只有当它与A不匹配时才返回C和B.
http://msdn.microsoft.com/en-us/library/bb208861(v=office.12).aspx
您不必在插入中指定列,因为select会为您执行此操作:
“您还可以使用INSERT INTO通过使用SELECT ... FROM子句从另一个表或查询中追加一组记录,如上面多记录追加查询语法中所示。在这种情况下,SELECT子句指定字段附加到指定的目标表。“
编辑:我相信下面的代码是一样的,但如果没有A.HKID IS NULL,也可以提高性能:
INSERT INTO TABLE2
SELECT B.*, C.* FROM TABLEA AS A
INNER JOIN ABC AS B ON A.HKID<>B.HKID
INNER JOIN DEF AS C ON A.HKID<>C.HKID
WHERE B.ORGANIZATION NOT LIKE '*xxx*' AND B.ADJ = 1 AND C.[STATUS] = 'SUSPEND';