2012-12-08 52 views
0

我在SQLSQL查询错误(NOT IN操作符)

SELECT E.ID E.name 
into #TmpEmplyee 
FROM Employee E, Outsourcing O, Student S 
WHERE E.ID NOT IN (SELECT ID FROM Student UNION SELECT ID FROM Outsourcing) 

此查询,我有这样的例外:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.name FROM Employee E, Outsourcing O, Student S WHERE E.ID NOT IN (SELECT ID FRO' at line 1

我试图运行内部查询和它的工作原理。我认为问题出在NOT IN运营商,但我不知道它在哪里。帮助将非常感谢!

+2

您错过了三个表之间的连接条件。我很确定你不想在三者之间进行笛卡尔连接。 –

+0

这是真的,我只是假定他从小开始,并且正在进行更复杂的连接。我一直这么做。 – gbtimmon

+0

必须将字段分开,在'E.ID'后加上逗号',' –

回答

2

你需要一个逗号:-)

SELECT E.ID, E.name 
1

缺少逗号:

SELECT E.ID, E.name 
      ^-- 

现在你要定义E.nameE.ID的别名,但别名不能有期在他们中。

1
SELECT E.ID, E.name 
into #TmpEmplyee 
FROM Employee E, Outsourcing O, Student S 
WHERE E.ID NOT IN (SELECT ID FROM Student UNION SELECT ID FROM Outsourcing); 

逗号很重要。

1

你需要查询之间的逗号

SELECT E.ID,E.name 
into #TmpEmplyee 
FROM Employee E, Outsourcing O, Student S 
WHERE E.ID NOT IN (SELECT ID FROM Student UNION SELECT ID FROM Outsourcing) 
1

更好的避免(而不是在做意想不到的事情与NULL值,(但是由于这些“关键领域”可能是不可为空,这将不会是一个问题在这里),并避免UNION(UNION需要删除重复,因此可能需要排序两次)),尤其是如果他们不需要; - )

注意:下面的查询可能会“短路”(它不是需要来评估两个EXISTSs,如果其中一个产生True),所以它可能需要在子查询中获取更少的行UNION变体。

SELECT E.ID,E.name 
-- into #TmpEmplyee 
FROM Employee E 
WHERE NOT EXISTS (
    SELECT * 
    FROM Student s 
    WHERE s.ID=E.ID 
    ) 
AND NOT EXISTS (
    SELECT * 
    FROM Outsourcing o 
    WHERE o.ID=E.ID 
    ) 
    ;