2

在我的 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吗?

4

2 回答 2

2

当您有多个 时JOIN,Access 的数据库引擎需要使用括号。

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

我必须进行更改,因为当我尝试访问时,Access 抱怨“不支持加入”ON A.HKID=C.HKID 如果这不令人满意,您将需要重新开始;我想我会以相反的顺序使用表格来解决这个问题并使用LEFT JOIN.

此外,您创建的表 ( Table2) 将包含名为B_HKIDand的字段C_HKID,它们来自B.HKIDand C.HKID。您将看到与这两个表共有的任何其他字段名称相同的模式。如果这是不可接受的,您可以单独列出字段并在需要时分配别名。

如果您安装了 Access,您应该在查询设计器中构建此查询,因为它将确保您正确设置连接以保持数据库引擎的运行。

Like如果您没有安装 Access,并且您从 ADO 连接运行此查询,请将字符串模式中的通配符从 更改*%

AND B.organization Not Like '%xxx%'
于 2012-07-20T05:13:30.463 回答
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 匹配。但我想您的 where 将其缩减为仅在与 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';
于 2012-07-20T03:57:14.123 回答