2013-04-11 77 views
3

我正在用asp.net和C#与访问数据库一起创建一个Web应用程序。查询中的语法错误(缺少运算符)带括号的FROM子句

我目前的问题是用SQL语句。在该项目中,我已经成功地使用字符串值来构建和存储查询。因为它存储在一个字符串中,所以看起来有点难看。问题在于我写的最后一个查询。它有2个内部连接,我不确定究竟是什么错误。 我得到的错误是语法错误(缺少运算符),然后列出括号内的所有内容。下面是该查询:

SELECT Employee.[First Name], Employee.[Last Name], Employee.[Email], 
     Departments.[Department] 
FROM (
    Employee INNER JOIN EmpDept ON Employee.[EmpUserName] = EmpDept.[EmpUserName] 
    INNER JOIN Departments ON Departments.[Department Number] = '2' 
) 
WHERE Departments.[Campus]='Clarion'; 

正是这样的非常难看,我知道..即时通讯希望,因为这是一个语法错误,它不会太难。

此查询旨在返回员工的姓名,电子邮件和部门。 2用c#代码给出,并在代码的早期确定,但代表某个部门。 empDept表位于Departments表和员工表之间,因此员工可以位于多个部门中。

任何帮助,非常感谢。谢谢

+0

'2用c#code'给出你的措辞使得它听起来像你有一个SQL注入无效性。这是**不**好,并关闭该洞应该优先编号1. – 2013-04-11 03:43:08

+0

我有一个字符串在asp页面后面的代码,我填充查询。 2是一个变量,我把字符串..我不知道它的脆弱与否..没有什么是通过URL传递的,它的全部保存在会话中。 – Tinkan 2013-04-11 17:46:20

+0

这是**非常脆弱,并且没有正确的做法。研究一下称为参数化查询的东西。 – 2013-04-11 18:49:45

回答

5

只删除括号。他们强制数据库尝试将整个表达式视为单个表,这是不正确的。

此外,根据您的描述,我会编写查询以使连接中的部门与EmpDept表中的内容匹配,然后使用WHERE子句过滤到部门'2'。现在,将部门表过滤到部门“2”,但将其无条件地与相关的保留为查询的其余部分。这意味着您正在从任何部门获取员工记录。

最后,我认为习惯使用表别名是一个好习惯。它不仅使您的代码更短,而且更高级的查询通常会从同一个表的多个实例中提取,并且别名会使您明确指出表中的哪个实例。

SELECT e.[First Name], e.[Last Name], e.[Email], d.[Department] 
FROM Employee e 
INNER JOIN EmpDept ed ON e.[EmpUserName] = ed.[EmpUserName] 
INNER JOIN Departments d ON d.[Department Number] = ed.[Deptartment Number] 
WHERE d.[Campus]='Clarion' AND d.[Department Number] = '2'; 
+0

嗯,我试着取出括号,但我仍然得到相同的语法错误。我也复制了你发布的内容并得到了同样的错误,这导致我相信我的结局存在问题。我畏缩地说,但我不得不在这里使用访问数据库,这可能是问题的一部分吗? – Tinkan 2013-04-11 17:43:19

+1

是的,这可能是其中的一部分。 Access有一些语法差异。 – 2013-04-11 18:48:24

2

试试这个

SELECT Employee.[First Name], Employee.[Last Name], 
Employee.[Email], Departments.[Department] 
FROM Employee 
INNER JOIN EmpDept ON Employee.[EmpUserName] = EmpDept.[EmpUserName] 
INNER JOIN Departments ON EmpDept.[DepartmentId] = Departments.[Id] 
WHERE Departments.[Campus]='Clarion' 
AND Departments.[Department Number] = '2' 

你需要在EMPDEPT表Departments表匹配的ID。

1
SELECT Employee.[First Name], Employee.[Last Name], Employee.[Email], Departments.[Department] 
FROM Employee 
INNER JOIN EmpDept ON Employee.[EmpUserName] = EmpDept.[EmpUserName] 
INNER JOIN Departments ON Departments.[Department Number] = Employee.[Department Number] 
WHERE Departments.[Campus]='Clarion' and Departments.[Department Number]=2 

有在squery小的语法错误,它更好地联同列名表和提在where子句..

0

尝试此列值条件:

SELECT Employee.[First Name], Employee.[Last Name], Employee.[Email], 
    Departments.[Department] 
FROM Employee 
    INNER JOIN EmpDept ON Employee.[EmpUserName] = EmpDept.[EmpUserName] 
    INNER JOIN Departments ON EmpDept.[Department Number] = Departments.[Department Number] 
     /* Or whatever your foreign key between Departments and EmpDept is */ 
WHERE Departments.[Department Number] = '2' 
    AND Departments.[Campus] = 'Clarion' 

如果您把你的心设在子查询上,你需要别名,并确保它自己形成一个完整的查询:

SELECT e.[First Name], e.[Last Name], e.Email, e.Department 
FROM 
(
    SELECT Employee.[First Name], Employee.[Last Name], Employee.[Email], 
     Departments.[Department], Departments.Campus 
    FROM Employee 
     INNER JOIN EmpDept ON Employee.[EmpUserName] = EmpDept.[EmpUserName] 
     INNER JOIN Departments ON EmpDept.[Department Number] = Departments.[Department Number] 
      AND Departments.[Department Number] = '2' 
) AS e 
WHERE e.Campus = 'Clarion' 
1

如果访问包含多个连接,则需要使用FROM子句中的括号。作为第一步,请在Access查询设计器中尝试这样的查询。

SELECT 
    Employee.[First Name], 
    Employee.[Last Name], 
    Employee.[Email], 
    Departments.[Department] 
FROM 
    (Employee 
    INNER JOIN EmpDept 
    ON Employee.[EmpUserName] = EmpDept.[EmpUserName]) 
    INNER JOIN Departments 
    ON Departments.[Department Number] = '2' 
WHERE Departments.[Campus]='Clarion'; 

我认为我正确放置括号;你可以在查询设计器中确认。然而,我对第二个ON条款感到困惑。

ON Departments.[Department Number] = '2' 

第不会从“左”的参与方引用的任何领域。我不明白它应该完成什么,我不确定数据库引擎是否会在那里做你想做的。

相关问题