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
当我在没有 where
clause 的情况下运行查询时,我得到了我想要的结果,但是当我添加 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子句中使用子选择中的列的主要内容,如果未能解决你的问题,请参考以下文章