【问题标题】:SQL use column from subselect in where clauseSQL在where子句中使用子选择中的列
【发布时间】: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 子句时,查询失败。

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

【问题讨论】:

    标签: mysql sql where-clause subquery


    【解决方案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。这次怎么样?
    猜你喜欢
    • 2015-07-25
    • 1970-01-01
    • 2015-10-26
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多