【问题标题】:how to solve every derived table must have it's own alias?如何解决每个派生表都必须有自己的别名?
【发布时间】:2021-05-29 12:00:03
【问题描述】:

我有这个 sql 查询

Select parent_order_id,product_id,hub_id,cast(1- '0.05' * MONTHS_BETWEEN(SYSDATE(), order_processing_date)as unsigned) AS total_sum 
      FROM (select q1.parent_order_id, q1.product_id, q1.hub_id, q1.order_processing_date from (select o1.parent_order_id, 
            o2.product_id, o1.hub_id, o1.order_processing_date from licious.orders as o1 join licious.order_items as o2 on o1.order_id = o2.order_id 
            WHERE DATE(o1.order_processing_date) BETWEEN DATE(DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 90 day) )AND DATE(CURRENT_TIMESTAMP()) 
            AND  o1.status = "Delivered") as q1 
        join ((select o1.parent_order_id from licious.orders as o1 join licious.order_items as o2 on o1.order_id = o2.order_id 
              WHERE DATE(o1.order_processing_date) BETWEEN DATE(DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 90 day) )
              AND DATE(CURRENT_TIMESTAMP()) AND  o1.status = "Delivered" group by parent_order_id having count(parent_order_id > 1)
              )) as q2 on q1.parent_order_id = q2.parent_order_id)
            group by 
              parent_order_id, 
              product_id, 
              hub_id, 
              order_processing_date 
            order by 
              parent_order_id desc, 
              total_sum desc;

我收到错误,每个派生表都必须有自己的别名 我知道我需要使用别名,但我已经使用过它并且我不知道在哪里修改我的查询 任何人都可以检查整个查询并更新它。这将是一个很大的帮助。

Ps:我刚刚编辑了我的问题,因为前一个问题只是通过编写 UNSIGNED 而不是 int 解决了

【问题讨论】:

  • 我在 SET o1.status = "Delivered" 上收到不同的错误。
  • 实际上是因为当我将它粘贴到任何 sql 美化器中时,它会在 SET o1.status = "Delivered" 上给出错误,但是当我尝试在 sql 工作台上执行它时,它会在 select 语句中给我跨度>
  • 我就是想不出正确的解决方案
  • SET 在此处无效,并且“我只是想不出正确的解决方案” - 您还没有描述您正在寻找的解决方案只是解决您的解决方案的问题。跨度>
  • 好吧,所以你说的不是 SET o1.status = "Delivered" 我应该写 o1.status = "Delivered"

标签: mysql sql


【解决方案1】:

您没有为外部查询提供别名:

Select parent_order_id,product_id,hub_id,cast(1- '0.05' * DATEDIFF(MONTH, SYSDATE(), order_processing_date)as unsigned) AS total_sum 
FROM (select q1.parent_order_id, q1.product_id, q1.hub_id, q1.order_processing_date from (select o1.parent_order_id, 
    o2.product_id, o1.hub_id, o1.order_processing_date from licious.orders as o1 join licious.order_items as o2 on o1.order_id = o2.order_id 
    WHERE DATE(o1.order_processing_date) BETWEEN DATE(DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 90 day) )AND DATE(CURRENT_TIMESTAMP()) 
    AND  o1.status = "Delivered") as q1 
join ((select o1.parent_order_id from licious.orders as o1 join licious.order_items as o2 on o1.order_id = o2.order_id 
      WHERE DATE(o1.order_processing_date) BETWEEN DATE(DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 90 day) )
      AND DATE(CURRENT_TIMESTAMP()) AND  o1.status = "Delivered" group by parent_order_id having count(parent_order_id > 1)
      )) as q2 on q1.parent_order_id = q2.parent_order_id) table1
    group by 
      parent_order_id, 
      product_id, 
      hub_id, 
      order_processing_date 
    order by 
      parent_order_id desc, 
      total_sum desc;

【讨论】:

  • 感谢解决。但是查询仍然没有工作,现在抛出这个错误 FUNCTION licious.MONTHS_BETWEEN 不存在。我使用 moths_between 来查找 SYSDATE() 和 order_processing_date 之间的月数
  • 你可以对mysql使用datediff而不是months_between stackoverflow.com/questions/288984/…
  • 你可以在 mysql 中使用 datediff 而不是months_between 这是错误的——将天数转换为月数是近似值。 TIMESTAMPDIFF(MONTH, ...) 需要。
  • 感谢 timestampdiff() 它现在运行良好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 2014-04-30
  • 1970-01-01
  • 1970-01-01
  • 2014-10-10
  • 2017-09-02
  • 1970-01-01
相关资源
最近更新 更多