【问题标题】:FULL JOIN query results in Error Code: 1054. Any workaround?FULL JOIN 查询导致错误代码:1054。任何解决方法?
【发布时间】:2022-01-19 06:28:30
【问题描述】:

我正在尝试连接两个表以显示与 where 子句匹配的所有行,而不仅仅是与连接匹配的行。这是两个账单表,我正在尝试合并它们,以便两个表中匹配年份和月份的每一行都有几个字段。

SELECT
    tblhydrobill.billyear, tblhydrobill.billmonth, tblhydrobill.KWH as elecconsumption, tblhydrobill.CurrentCharges as eleccost,
    tblgasdata.cubicft as gasconsumption, tblgasdata.total as gascost
FROM tblhydrobill
FULL JOIN tblgasdata ON tblhydrobill.billyear = tblgasdata.billyear and tblhydrobill.billmonth = tblgasdata.billmonth
WHERE tblhydrobill.meteridnumber = 19 and tblgasdata.buildingid = 19
ORDER BY tblhydrobill.billyear asc, tblhydrobill.billmonth asc

LEFT JOIN 可以正确执行,但只显示两个表上存在月/年数据的结果。我试图让它返回所有行,如果连接的一侧有空字段,如果另一侧没有匹配项,则可以,反之亦然。

使用 FULL JOIN 我得到以下 MySQL 错误:

Error Code: 1054. Unknown column 'tblhydrobill.billyear' in 'field list'

更新:

@jarlh 指出,MySQL 尚不支持 FULL JOIN,谢谢。

【问题讨论】:

  • AFAIK MySQL 没有 FULL OUTER JOIN 支持。
  • 另外,您的 WHERE 子句条件使 FULL JOIN 返回常规的 INNER JOIN 结果。将这些条件移至 ON 子句以获得真正的 FULL JOIN 结果。 (在支持它的 dbms 上。)
  • 另请注意,表格有,而不是字段。
  • 发布完整的错误信息会有所帮助。
  • 由于 MySQL 无法识别 FULL JOIN,'FULL' 很可能被解释为 tblhydrobill 的别名。所以 tblhydrobill.billyear 不再是有效的 col 引用。

标签: mysql sql join outer-join


【解决方案1】:

由于MySql 不支持FULL JOIN,它使用FULL 作为tblhydrobill 的别名。

但可以模拟 FULL JOIN。

SELECT h.billyear, h.billmonth
, h.KWH as elecconsumption
, h.CurrentCharges as eleccost
, g.cubicft as gasconsumption
, g.total as gascost
FROM tblhydrobill h
LEFT JOIN tblgasdata g 
  ON g.billyear = h.billyear 
 AND g.billmonth = h.billmonth
 AND g.buildingid = 19
WHERE h.meteridnumber = 19

UNION ALL

SELECT g.billyear, g.billmonth
, h.KWH as elecconsumption
, h.CurrentCharges as eleccost
, g.cubicft as gasconsumption
, g.total as gascost
FROM tblgasdata g 
LEFT JOIN tblhydrobill h
  ON h.billyear = g.billyear 
 AND h.billmonth = g.billmonth
 AND h.meteridnumber = 19
WHERE g.buildingid = 19
  AND h.billyear IS NULL

ORDER BY billyear, billmonth

【讨论】:

  • UNION ALL 也会折叠左/右表中不匹配的双精度数。谨慎使用此方法,它返回的结果可能与 FULL JOIN 略有不同。
  • UNION ALL 不会使重复的行唯一。第二次只是添加第一次中缺少的内容。我仍然更喜欢它而不是使用普通的UNION
  • 考虑the example。注意 UNION 和 UNION ALL 都不同于 FULL JOIN
  • @Serg 请参阅您的小提琴的this version。注意where t1.id is null
  • 好。它按预期工作。
【解决方案2】:

您可以使用union 生成一个或两个表中存在的年月对列表,然后使用该结果左连接两个表:

select *
from (
    select billyear, billmonth from tblhydrobill where meteridnumber = 19
    union
    select billyear, billmonth from tblgasdata   where buildingid = 19
) as ym
left join tblhydrobill on tblhydrobill.billyear = ym.billyear and tblhydrobill.billmonth = ym.billmonth and tblhydrobill.meteridnumber = 19
left join tblgasdata   on tblgasdata.billyear   = ym.billyear and tblgasdata.billmonth   = ym.billmonth and tblgasdata.buildingid = 19
order by ym.billyear, ym.billmonth

请注意,可以手动构建ym 列表,例如:

from (
    select 2022,  1 union
    select 2021, 12 union
    select 2021, 11
) as ym

【讨论】:

    最近更新 更多