2014-09-29 76 views
2

下面的查詢工作:包裝SQL查詢導致語法錯誤

SELECT DISTINCT `number` 
    FROM `employee` 
    WHERE `number` IN 
      (SELECT `department_manager` 
      FROM `department`) 
    UNION 
    (SELECT DISTINCT `manager` 
     FROM `employee` 
     WHERE `manager` IS NOT NULL) 

但只要我包裹查詢用括號它不工作了:

(SELECT DISTINCT `number` 
    FROM `employee` 
    WHERE `number` IN 
      (SELECT `department_manager` 
      FROM `department`) 
    UNION 
    (SELECT DISTINCT `manager` 
     FROM `employee` 
     WHERE `manager` IS NOT NULL)) 

曹景偉語法錯誤:

ERROR 1064 (42000): 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 'UNION 

在圓括號中包裝其他選擇查詢不會導致問題,例如:

(SELECT DISTINCT number FROM johnson.employee); 

這些有什麼區別?

+1

圍繞第二括號中的第一個查詢選擇已經無用的,沒有必要的。 – 2014-09-29 17:12:36

+0

那麼不要把它包裹在圓括號裏? – 2014-09-29 17:18:04

+1

@MichaelMcGriff如果我真的知道爲什麼會不會更有趣? – 2014-09-29 17:18:43

回答

2

這與MySQL實現其SQL語法的方式有關。

一個<query>可以是:

SELECT ... [ UNION <query>] 

(SELECT ...) [ UNION <query> ] 

但顯然不是

(SELECT ... UNION <query>) 

閱讀sql/sql_yacc.yy在MySQL源代碼,如果你想要的細節。

作爲一種變通方法,你可以這樣做:

SELECT * FROM (SELECT ... UNION SELECT ...) AS t; 
+0

我明白了,謝謝你提供的信息! – 2014-09-29 20:20:54

0

查詢周圍的括號是子查詢 - 想象這幾乎就像一個子程序,其中內部查詢首先執行,然後在外部查詢的上下文中評估其結果。在第二個示例中,您正在定義一個沒有外部查詢的子查詢,因此存在語法錯誤。

您可以將第二個示例轉換爲有效的sql,只需在第一個圓括號前面加上SELECT,在右圓括號後面加上'FROM DUMMY'即可;嘗試一下。

+0

我有幾個其他查詢包裝在方括號不會導致任何問題。這裏是一個: '(SELECT DISTINCT number FROM johnson.employee)' 這裏有什麼區別? – 2014-09-29 17:17:19