SQL在where子句中使用子选择中的列

Posted

技术标签:

【中文标题】SQL在where子句中使用子选择中的列【英文标题】:SQL use column from subselect in where clause 【发布时间】:2013-08-04 11:38:36 【问题描述】:

我有一个类似这样的查询:

SELECT a, b, c,
    (SELECT d from B limit 0,1) as d
FROM A
WHERE d >= 10

当我在没有 whereclause 的情况下运行查询时,我得到了我想要的结果,但是当我添加 where 子句时,查询失败。

有没有人建议如何解决这个问题?

【问题讨论】:

【参考方案1】:

您不能在WHERE 子句中使用列别名。

因此,您可以将查询包装在外部选择中并在那里应用您的条件

SELECT * 
  FROM
(
  SELECT a, b, c,
    (SELECT d FROM B LIMIT 0,1) d
  FROM A
) q
 WHERE d >= 10

或者您可以在HAVING 子句中引入该条件

SELECT a, b, c,
    (SELECT d FROM B LIMIT 0,1) d
  FROM A
HAVING d >= 10

另一种方法是使用CROSS JOIN 并在WHERE 子句中应用您的条件

SELECT a, b, c, d
  FROM A CROSS JOIN 
(
  SELECT d FROM B LIMIT 0,1
) q
 WHERE d >= 10

这里是上述所有查询的 SQLFiddle 演示。

【讨论】:

非常有帮助,+1 提到了非常有用的 SqlFiddle:) 很好,你提到了 HAVING,因为它一直被认为只对 GROUP BY 有用。 使用查询包装与have子句与交叉连接对性能有何影响?【参考方案2】:

这是你想要的吗?

SELECT a, b, c,
    B.d
FROM A, (SELECT d from B limit 0,1) B
WHERE B.d >= 10 

【讨论】:

不,因为如果例如 d 不是 >= 10,则该列将只是空的,但我希望如果 where 子句不匹配,则不会显示整行 @Chris TableA 和 TalbeB 之间有什么关系吗? 对不起,我没有环境可以测试。我改变了sql。这次怎么样?

以上是关于SQL在where子句中使用子选择中的列的主要内容,如果未能解决你的问题,请参考以下文章

使用子查询添加具有不同 where 子句的列

SQL 优化 where 子句中的条件

如何在子查询的 WHERE 子句中使用来自 UNNEST 的多个值?

SQL相关子查询与非相关子查询

深入理解CQL中的Where子句

sql where子句中的列顺序