无法深入访问字段多个子查询

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 语法有错误;

以上是关于无法深入访问字段多个子查询的主要内容,如果未能解决你的问题,请参考以下文章

多个子字段的 MongoDB 查询匹配

在 MySQL 子查询中选择多个列/字段

使用子查询更新语句

SQL错误使用多个子查询的字段列表中的未知列

ORA-01427:单行子查询返回多个行

返回链接记录并避免多个子查询/循环