2010-08-31 63 views
2

我在下面的查询得到一个语法错误:MySQL的WHERE总是需要一台

SELECT 1,2 WHERE 1=1

但这查询工作正常:

SELECT 1,2 FROM (SELECT 1) t WHERE 1=1;

它几乎看起来像一个WHERE子句总是需要一个表。有时,在复杂查询的深度中,使用SELECT/WHERE组合打开和关闭某些功能是非常好的。有没有办法不总是添加FROM (SELECT 1) t

编辑:

我发现了另一个类似的问题

 

(SELECT 1 x) 
UNION 
(SELECT 2) 
WHERE 1=1 
 

给出了一个语法错误,但这并不:

 

SELECT x 
FROM 
(
    (SELECT 1 x) 
    UNION 
    (SELECT 2) 
) t 
WHERE 1=1 
 

我使用5.1.48-community MySQL Community Server (GPL)。有没有人看到这个?

回答

0

此:

SELECT 1 x 
UNION 
SELECT 2 
WHERE 1 = 1 

是两个查询,用UNION结合。第二个查询:

SELECT 2 
WHERE 1 = 1 

是无效的,因为它同时仍使用WHERE错过了FROM条款。

此:

SELECT x 
FROM (
     SELECT 1 x 
     UNION 
     SELECT 2 
     ) t 
WHERE 1 = 1 

是从共线视图,这是再一次,两个查询与UNION组合的SELECT

这两个查询都不使用WHERE,所以他们没有FROM也没关系。两个查询都是有效的,结果查询也是。

1

你可以使用“FROM DUAL”来表示你没有从表中选择。如:

SELECT 'Hello, World' FROM DUAL; 
+1

这是直接从[参考手册](http://dev.mysql.com/doc/refman/5.0/en/select.html),但注意它后面的行:“DUAL纯粹是为了方便需要所有SELECT语句应该有FROM和可能的其他子句的人,MySQL可能会忽略这些子句,如果没有引用表,MySQL不需要FROM DUAL。这表明你不需要“发表”声明。让我困惑的颜色。 – eykanal 2010-08-31 21:44:04

+0

@eykanal:如果您要使用'WHERE' – Quassnoi 2010-08-31 21:44:58

+0

@OMGPonies:而不是'PostgreSQL',则需要'FROM'子句。 – Quassnoi 2010-08-31 21:55:08