无法深入访问字段多个子查询
Posted
技术标签:
【中文标题】无法深入访问字段多个子查询【英文标题】:Cannot access field multiple sub queries deep 【发布时间】:2015-04-17 12:40:07 【问题描述】:我在尝试访问子查询的子查询中的选定字段时遇到错误。它显示“where 子句中的未知列”。我还有其他使用相同字段的子查询,它们工作得很好。只有当我尝试在子查询中访问子查询中的字段时,才会出现此问题。
我的查询的简化版本
SELECT r.id,
(SELECT min(begindatum)
FROM ((SELECT begindatum FROM reservatiekamer
WHERE reservatieId = r.id) UNION
(SELECT begindatum FROM reservatiefaciliteit
WHERE reservatieId = r.id)) as bg)
as begindatum
FROM reservatie r
错误
#1054 - Unknown column 'r.id' in 'where clause'
背景故事,我正在尝试选择存在多个房间和设施预订(2 张不同桌子)的预订的开始日期。
【问题讨论】:
你的意思是FROM reservatie AS r
?
在 mysql 中 AS 不是可选的吗?
AS 在 MySQL 中确实是可选的。我在完整查询中的很多地方都使用了“r”,除了在子查询的子查询中,它不会导致任何问题。
【参考方案1】:
如果子查询总是只返回一个值,你可以使用least()
:
SELECT r.id,
least((SELECT begindatum FROM reservatiekamer WHERE reservatieId = r.id),
(SELECT begindatum FROM reservatiefaciliteit WHERE reservatieId = r.id)
) as begindatum
FROM reservatie r;
实际上,这种变化会更好:
SELECT r.id,
least(COALESCE((SELECT MIN(begindatum) FROM reservatiekamer WHERE reservatieId = r.id), 0),
COALESCE((SELECT MIN(begindatum) FROM reservatiefaciliteit WHERE reservatieId = r.id), 0)
) as begindatum
FROM reservatie r;
这假设值始终为正,这就是0
存在的原因。另一个值可能更合适。
最后,您可以将逻辑移至from
子句:
SELECT r.id,
LEAST(COALESCE(rk.minbd, rf.minbd), COALESCE(rf.minbd, rk.minbd)) as begindatum
FROM reservatie r LEFT JOIN
(SELECT reservatieId, MIN(begindatum) as minbd
FROM reservatiekamer
GROUP BY reservatieId
) rk
ON r.id = rk.reservatieId LEFT JOIN
(SELECT reservatieId, MIN(begindatum) as minbd
FROM reservatiefaciliteit
GROUP BY reservatieId
) rf
ON r.id = rf.reservatieId;
coalesce()
是 least()
旨在返回一个值,如果另一个值是 NULL
。
【讨论】:
第一个和第三个查询给我一个错误。第二个没有给我我需要的结果,在 15 条记录中,其中 13 条的 begindatum 为“0”,只有 2 条有实际日期。 第一次查询时出错:#1242 - 子查询返回多于 1 行第三次查询时出错:#1064 - 您的 SQL 语法有错误;以上是关于无法深入访问字段多个子查询的主要内容,如果未能解决你的问题,请参考以下文章