我有一个相当复杂的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)
答案 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...