子查询中的错误1054未知列

时间:2014-08-12 14:21:01

标签: mysql

我有一个相当复杂的SQL语句,它不起作用,我需要修复。我正在尝试类似以下的内容

SELECT
  t1.id,
  COALESCE(
    (
      SELECT
        t2.value
      FROM
        my_table AS t2
      WHERE
        t2.id = t1.id AND
        t2.ref = 'aa'
    ),
    (
      SELECT
        SUM(t3.value) AS value
      FROM
        (
          SELECT
            t4.value
          FROM
            my_table as t4
          WHERE
            t4.id = t1.id AND
            t4.ref IN ('bb', 'cc')
        ) AS t3
     )
  )
FROM
  my_table AS t1
WHERE
  id IN (1,2,3,4,5)

我需要COALESCE函数来获取具有特定ref的第一个值。但是,对于两个特定的参考,我需要值的总和(叹气)。

我曾经计算过两个COALESCE函数的总和:对于ref bb和ref cc。我使用COALESCE函数的原因是因为它是一个总和,如果bb或cc的值不存在,我必须使用0。错误是如果bb或cc的值都不存在,则sum为0(而不是null),外部COALESCE函数返回0而不是null。

所以,我正在尝试重构上述语句,但我收到了错误

Error Code: 1054. Unknown column 't1.id' in 'where clause' on line 23

有什么建议吗?

修改

忘记COALESCE功能。以下内容返回相同的错误

SELECT
  t1.id,
  (SELECT
     SUM(t3.value) AS value
   FROM
     (
       SELECT
         t4.value
       FROM
         my_table as t4
       WHERE
         t4.id = t1.id AND
         t4.ref IN ('bb', 'cc')
     ) AS t3
  ) AS value
FROM
  my_table AS t1
WHERE
  id IN (1,2,3,4,5)

1 个答案:

答案 0 :(得分:1)

请记住,子查询的结果显示为外部查询的表。您正在做的事情归结为:

SELECT foo         // query #3
FROM (
   SELECT bar      // query #2
   FROM (
      SELECT baz   // query #1
      FROM t1
   ) AS t2
) AS t3

内部查询#1返回一个表,其中包含一个名为baz的列,用于查询#2。该查询尝试从该虚拟表中选择名为bar的列,但那里只有baz。这是一个未知的专栏"错误。

同样适用于查询#3(外部)。它需要一个名为foo的字段,该字段中只有一个bar

如果您希望查询有效,则需要更多类似的内容:

SELECT foo
FROM (
    SELECT COALESCE(....) AS foo  // <--note the alias here
    etc...