2013-04-11 3 views
3

Я работаю с asp.NET и C# с базой данных доступа для создания веб-приложения.Ошибка синтаксиса (отсутствующий оператор) в запросе с предложением в скобках 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'; 

Это очень некрасиво, как это, я знаю .. Im надеясь, что так как это ошибка синтаксиса он не будет слишком сложно.

Этот запрос предназначен для возврата имени, электронной почты и отдела сотрудника. 2 задается с кодом C# и определяется ранее в коде, но это означает определенный отдел. Таблица empDept находится между таблицей отделов и таблицей сотрудников, поэтому сотрудник может находиться в нескольких отделениях.

Любая помощь очень ценится. Спасибо

+0

'2 задан с кодом C#. Как вы сформулировали это, это звучит так, как будто у вас есть вулканизация в sql. Это ** не ** нормально, и закрытие этого отверстия должно быть приоритетом номер 1. –

+0

У меня есть строка в коде за страницей asp, и я заполняю ее запросом. 2 - переменная, которую я вставляю в строку. Я не знаю, является ли ее уязвимым или нет. Ничто не проходит через URL-адрес, а все сохранено в сеансе. – Tinkan

+0

Это ** крайне ** уязвимо, а не совсем правильный способ сделать это. Посмотрите на что-то, называемое параметризованными запросами. –

ответ

5

Просто удалите скобки. Они заставляют базу данных пытаться обрабатывать все выражение как одну таблицу, что неверно.

Кроме того, на основе вашего описания я бы написал запрос, чтобы он соответствовал отделу в соединении с тем, что находится в таблице EmpDept, а затем используйте предложение WHERE для фильтрации до дельта '2'. Прямо сейчас вы отфильтровываете таблицу Департамента до отдела «2», но оставьте его безоговорочно связанным с остальной частью запроса. Это означает, что вы забираете записи Employee из любого отдела.

Наконец, я считаю хорошей практикой привыкнуть к использованию псевдонимов таблицы. Это не только делает ваш код короче, но более сложные запросы часто вытягиваются из более чем одного экземпляра одной и той же таблицы, а псевдонимы делают его явным, какой экземпляр таблицы вы имеете в виду.

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

+1

Да, это, вероятно, часть этого. Доступ имеет некоторые различия в синтаксисе. –

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, который соответствует таблице Отделы.

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, лучше объединять таблицы с колонкой именем и указать столбец условие значение в том, где пункт ..

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' 

Это положение не ссылается на любое поле из «левых» стороны соединения. Я не понимаю, что он должен выполнить, и я не уверен, что движок db сделает то, что вы хотите.

Смежные вопросы