2011-04-28 3 views
3
SELECT E.id_employee,E.name,E.age,E.wage,D.name, 
    CASE (SELECT COUNT(*) FROM manages M 
     WHERE M.id_employee=E.id_employee) 
     WHEN 1 THEN 'Chief' 
     WHEN 0 THEN '-' 
    END CASE 
FROM Employee E 
INNER JOIN work_in 
INNER JOIN Department D 

дает эту ошибку:Что не так с моим MySQL-запросом?

Не удалось подключиться: У вас ошибка в вашем SQL синтаксиса; проверьте руководство, которое соответствует версии сервера MySQL для корректного синтаксиса использовать вблизи «СЛУЧАЙ ИЗ Сотрудника E INNER JOIN work_in INNER JOIN отдел D» в строке 5

Что я здесь отсутствует? Немедленно помогите.

ответ

3

Там нет 'ДЕЛО' после того, как 'END'

SELECT E.id_employee,E.name,E.age,E.wage,D.name, 
       CASE (SELECT COUNT(*) FROM manages M WHERE M.id_employee=E.id_employee) 
        WHEN 1 THEN 'Chief' 
        WHEN 0 THEN '-' 
       END 
FROM Employee E INNER JOIN work_in INNER JOIN Department D 
+1

http://dev.mysql.com/doc/refman/5.0/en/case-statement.html не согласен. – Nik

+0

это 'END CASE' –

+2

Ну, не в запросе ... http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html. Это два разных оператора CASE, и OP нужен тот, у кого нет КОНЕЧНОГО ДЕЛА. –

3

Удалить слово из СЛУЧАЙ после END.

1

Вам не хватает ON условие для inner join или USING() статья.

SELECT E.id_employee,E.name,E.age,E.wage,D.name, 
       CASE (SELECT COUNT(*) FROM manages M WHERE M.id_employee=E.id_employee) 
        WHEN 1 THEN 'Chief' 
        WHEN 0 THEN '-' 
       END 
      FROM Employee E 
       INNER JOIN work_in w 
        ON e.id_employee=w.id.employee 
       INNER JOIN Department D 
        ON w.id_department=D.id_department 
+0

Вы заметите, что условие * соединения * в INNER JOIN не является обязательным: 'join_table: table_reference [INNER | CROSS] JOIN table_factor [join_condition] | ... ' – Orbling

+0

@ Orbling - уверен, это необязательно, но вы думаете, что запрос будет проходить проверку синтаксиса без него? Это действительно необязательно по двум причинам: из-за CROSS JOIN и потому, что вы можете использовать условие USING() или WHERE для условий соединения. У него есть внутреннее соединение и нет ГДЕ. – dawebber

+0

@ dawebber, протестировал его, следующий запрос действительно работает: 'select * from table1 inner join table2;' Как ни странно, он делает полное внешнее соединение таким образом :-) – Johan

4

Удалить последний случай ключевое слово, после окончания

1

Изменить это:

"SELECT E.id_employee,E.name,E.age,E.wage,D.name, 
    CASE (SELECT COUNT(*) FROM manages M WHERE M.id_employee=E.id_employee) 
    WHEN 1 THEN 'Chief'      
    WHEN 0 THEN '-'     
    END    
FROM Employee E 
INNER JOIN work_in w ON (w.id = e.work_id) 
INNER JOIN Department D ON (D.id = e.department_id)" 

Предупреждение
Если вы делаете inner join без каких-либо условий (ы), он будет фактически превращаются в full outer join!
Это означает, что если вы запустите следующий запрос:

SELECT * FROM a 
INNER JOIN b 
INNER JOIN c 

где таблица а, б и у каждого есть 100 строк, вы получите в общей сложности 1000000 строк в вашем результирующем, перечисляя все возможные комбинации, b и c.
В 99,999% случаев это определенно не то, что вы хотите.

2

Вы смешиваете синтаксис CASE Statement и CASE expression. В то время как первый используется в хранимых процедурах, второй - тот, который используется в операторах SQL.

CASE выражение

SELECT CASE 1 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'more' END; 

CASE заявление

CASE case_value 
    WHEN when_value THEN statement_list 
    [WHEN when_value THEN statement_list] ... 
    [ELSE statement_list] 
END CASE 

Или, как руководство ставит его

Note

The syntax of the CASE statement used inside stored programs differs slightly from that of the SQL CASE expression described in Section 11.4, “Control Flow Functions”. The CASE statement cannot have an ELSE NULL clause, and it is terminated with END CASE instead of END.

Так что в вашем случае CASE после END.

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