2013-07-30 43 views
1

我有3代表与各列:查询返回中的语法错误FROM子句

tableA = id(PK) & name columns 
tableB = id(PK), A_ID(foreign key to tableA), name, address, etc columns 
tableC = id(PK), A_ID(foreign key to tableA), name columns 

我尝试使用下面的查询基于表A NAME =所有表中检索某些列的值“的东西',但总是返回语法错误。

“SELECT tableA.name, tableB.name, tableB.address, tableC.name FROM 
tableA, tableB, tableC JOIN tableB ON tableA.id = tableB.A_ID JOIN tableC 
ON tableA.id = tableC.A_ID WHERE tableA.name = ‘something’” 

回答

1

Ms Access需要您指定加入类型:INNER; LEFT;或RIGHT。 Access不能识别JOIN作为INNER JOIN的同义词。

包含多个连接的查询需要在FROM子句中使用括号。

我也将您的报价字符更改为普通"'。示例查询包括类型设置引号。我不知道它们是否存在于实际的SQL中,但我会避免它们。

SELECT tableA.name, tableB.name, tableB.address, tableC.name 
FROM 
    (tableA 
    INNER JOIN tableB 
    ON tableA.id = tableB.A_ID) 
    INNER JOIN tableC 
    ON tableA.id = tableC.A_ID 
WHERE tableA.name = 'something' 

如果您有Access的完整版本,请使用查询设计器设置连接。设计者知道保持数据库引擎高兴的语法规则。

+0

谢谢,那是我的问题,在我的加入没有禁忌。我将它更改为INNER JOIN,但是使用了JOIN,因为我读过'默认情况下连接是内连接。连接语句与内部连接语句相同'.... Jesse Liberty学习C#。 – KFP

+0

许多数据库都是如此,但不是Access。如果您可以使用Access查询设计器,您的生活将会变得更加轻松。如果您没有Access,则可能需要安装评估版本。 – HansUp

+0

我从一个winforms项目运行这个并使用OleDbDataReader来检索记录。 – KFP

2

你必须从from语句删除表,如果你想使用join语法

SELECT tableA.name, tableB.name, tableB.address, tableC.name 
FROM tableA 
INNER JOIN tableB ON tableA.id = tableB.A_ID 
INNER JOIN tableC ON tableA.id = tableC.A_ID 
WHERE tableA.name = 'something' 

我建议你使用别名,代码可以更易读:

SELECT A.name, B.name, B.address, C.name 
FROM tableA A 
INNER JOIN tableB B ON A.id = B.A_ID 
INNER JOIN tableC C ON A.id = C.A_ID 
WHERE A.name = 'something' 
+0

我试过这种方法,但在FROM子句中出错。 – KFP

+0

如上所述尝试使用'INNER JOIN'。 – Parado

0

否则你可以这样做:

SELECT tableA.name, tableB.name, tableB.address, tableC.name 
FROM tableA, tableB, tableC 
WHERE tableA.id = tableB.A_ID AND tableA.id = tableC.A_ID 
AND tableA.name = ‘something 
0

Parado的答案是正确的..

而且你可以通过使用别名表名简化查询的长度..它是很好的做法太..

选择a.name,B .name,b.address from tableA a join tableB b on a.id = b.A_ID