MariaDB 5.5 如何为单个派生表设置多个别名 附实际业务查询场景
问题解答
能否为单个派生表设置多个别名?
你使用的5.5.52-MariaDB版本不支持该操作,存在两个核心限制:
- 派生表的作用域仅局限于定义它的FROM子句层级,你在外层FROM中定义的派生表,无法在内层子查询中被引用,这是你写的
tmpClone不生效的核心原因 - 单个派生表仅支持设置一个别名,无法通过逗号分隔等方式同时绑定多个别名
业务需求正确实现方式
你要实现「指定仓库下每种货物最后一次售卖时间」的需求不需要用到多别名派生表,可直接通过以下两种方案实现:
方案1:仅查询货物ID、货物名称、最后售卖时间
如果不需要对应售卖记录的其他字段,直接分组查询即可:
SELECT ii.GoodId, g.Name AS GoodName, MAX(ih.Date) AS LastSellDate FROM invoiceheader ih INNER JOIN invoiceitems ii ON ih.Id = ii.HeaderId LEFT JOIN goods g ON ii.GoodId = g.Id WHERE ih.Warehouse = 1 -- 替换为你要查询的目标仓库ID AND ih.Date IS NOT NULL AND ii.GoodId > 0 GROUP BY ii.GoodId, g.Name;
方案2:查询最后一次售卖的完整明细
如果需要获取该次售卖对应的数量、价格、买家ID等完整信息,可以用关联子查询实现:
SELECT ii.Id AS ItemId, ii.GoodId, g.Name AS GoodName, ii.Qty, ii.Price, ih.Date AS LastSellDate, ih.Warehouse, ih.BuyerId FROM invoiceheader ih INNER JOIN invoiceitems ii ON ih.Id = ii.HeaderId LEFT JOIN goods g ON ii.GoodId = g.Id INNER JOIN ( -- 先查询每个商品的最大售卖时间 SELECT ii2.GoodId, MAX(ih2.Date) AS MaxSellDate FROM invoiceheader ih2 INNER JOIN invoiceitems ii2 ON ih2.Id = ii2.HeaderId WHERE ih2.Warehouse = 1 -- 替换为目标仓库ID AND ih2.Date IS NOT NULL AND ii2.GoodId > 0 GROUP BY ii2.GoodId ) t ON ii.GoodId = t.GoodId AND ih.Date = t.MaxSellDate WHERE ih.Warehouse = 1 -- 替换为目标仓库ID AND ih.Date IS NOT NULL AND ii.GoodId > 0;
如果你确实需要复用同一段派生表逻辑,在不支持CTE的MariaDB 5.5版本中,你可以选择将这段逻辑重复写在需要用到的位置,或者提前创建为视图使用。
内容的提问来源于stack exchange,提问作者FiddlingAway
相关产品推荐
相关产品推荐

