两个右连接一个Access SQL查询

时间:2012-07-20 03:24:59

标签: sql ms-access ms-access-2007

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

2 个答案:

答案 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_HKIDC_HKID的字段,这些字段来自B.HKIDC.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';