【问题标题】:Outer select column value in joined subquery?连接子查询中的外部选择列值?
【发布时间】:2010-04-21 22:41:28
【问题描述】:

是否可以在连接子查询中使用来自外部选择的列值?

SELECT table1.id, table2.cnt
FROM table1 LEFT JOIN (SELECT COUNT(*) as `cnt`
                       FROM table2
                       WHERE table2.lt > table1.lt and table2.rt < table1.rt) AS table2 ON 1;

这会导致“'where 子句'中的未知列 'table1.lt'”。

这是数据库转储。

CREATE TABLE IF NOT EXISTS `table1` ( `id` int(1) NOT NULL, `lt` int(1) NOT NULL, `rt` int(4) NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `table2` ( `id` int(1) NOT NULL, `lt` int(1) NOT NULL, `rt` int(4) NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `table1` (`id`, `lt`, `rt`) VALUES (1, 1, 4);

INSERT INTO `table2` (`id`, `lt`, `rt`) VALUES (2, 2, 3);

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您的内部查询是一个相关的子查询,但它根本看不到 table1。这是对 MySQL 的限制 - 请参阅 MySQL Manual - D.3. Restrictions on Subqueries。大约一半时它说:

    FROM 子句中的子查询不能 是相关的子查询。他们是 物化(执行以产生一个 结果集)在评估之前 外部查询,所以它们不能 对外部查询的每行进行评估。

    虽然子查询是 LEFT JOIN 表达式的一部分,但它是 FROM 子句的一部分。

    这种重新制定可能会为您完成这项工作:

    SELECT table1.id, 
           (SELECT COUNT(*)
            FROM table2
            WHERE table2.lt > table1.lt
            AND table2.rt < table1.rt) AS cnt
    FROM table1;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-04
      • 2023-03-24
      • 1970-01-01
      相关资源
      最近更新 更多