【问题标题】:MySQL, CROSS JOIN and unknown columnMySQL、CROSS JOIN 和未知列
【发布时间】:2016-09-07 20:34:20
【问题描述】:

我编写了使用子查询的 mysql 查询。我不明白为什么 mysql 在子查询中的“where 子句”中显示“未知列 'T.TICKETID'”。对于 MSSQL,它可以正常工作。

SELECT @PERIODTYPE := 'Y';


SELECT
  @PERIODTYPE,
  CASE 
    WHEN @PERIODTYPE = 'W' THEN DATE_FORMAT(R.DATENEW,'%u')
    WHEN @PERIODTYPE = 'M' THEN DATE_FORMAT(R.DATENEW,'%Y-%m')
    WHEN @PERIODTYPE = 'Y' THEN DATE_FORMAT(R.DATENEW,'%Y')
    ELSE DATE_FORMAT(R.DATENEW,'%Y-%m-%d') 
  END `Period`,
  DATE_FORMAT(MIN(R.DATENEW),'%Y-%m-%d') min_date,
  DATE_FORMAT(MAX(R.DATENEW),'%Y-%m-%d') max_date,
  COUNT(*) Transactions,
  SUM(SQ.`Sold Units`)  `Sold Units`,
  FORMAT(MAX(P.TOTAL), 2) `Largest Order`, 
  FORMAT(SUM(P.TOTAL), 2) `Total $ Sold`,
  FORMAT(SUM(TXL.AMOUNT), 2) `Total Tax $ Collected`
FROM RECEIPTS R INNER JOIN TAXLINES TXL ON R.ID = TXL.RECEIPT
                INNER JOIN TAXES TX ON TXL.TAXID = TX.ID 
                INNER JOIN TAXCATEGORIES TXC ON TX.CATEGORY = TXC.ID 
                INNER JOIN PAYMENTS P ON P.RECEIPT = R.ID
                INNER JOIN TICKETS T ON R.ID = T.ID  
                CROSS JOIN (SELECT SUM(TL.UNITS) 'Sold Units' FROM TICKETLINES TL WHERE T.TICKETID = TL.TICKET)  SQ
GROUP BY CASE 
    WHEN @PERIODTYPE = 'W' THEN DATE_FORMAT(R.DATENEW,'%u')
    WHEN @PERIODTYPE = 'M' THEN DATE_FORMAT(R.DATENEW,'%Y-%m')
    WHEN @PERIODTYPE = 'Y' THEN DATE_FORMAT(R.DATENEW,'%Y')
    ELSE DATE_FORMAT(R.DATENEW,'%Y-%m-%d')
  END
ORDER BY R.DATENEW

更新 1

我替换了表名 (TICKETS) 而不是别名 (T)。我有错误。请看截图。

SELECT @PERIODTYPE := 'D';


SELECT
  @PERIODTYPE,
  CASE 
    WHEN @PERIODTYPE = 'W' THEN DATE_FORMAT(R.DATENEW,'%u')
    WHEN @PERIODTYPE = 'M' THEN DATE_FORMAT(R.DATENEW,'%Y-%m')
    WHEN @PERIODTYPE = 'Y' THEN DATE_FORMAT(R.DATENEW,'%Y')
    ELSE DATE_FORMAT(R.DATENEW,'%Y-%m-%d') 
  END `Period`,
  DATE_FORMAT(MIN(R.DATENEW),'%Y-%m-%d') min_date,
  DATE_FORMAT(MAX(R.DATENEW),'%Y-%m-%d') max_date,
  COUNT(*) Transactions,
  FORMAT(SUM(IFNULL(SQ.`Sold Units`,0)),2)  `Sold Units`,
  FORMAT(MAX(P.TOTAL), 2) `Largest Order`, 
  FORMAT(SUM(P.TOTAL), 2) `Total $ Sold`,
  FORMAT(SUM(TXL.AMOUNT), 2) `Total Tax $ Collected`
FROM RECEIPTS R INNER JOIN TAXLINES TXL ON R.ID = TXL.RECEIPT
                INNER JOIN TAXES TX ON TXL.TAXID = TX.ID 
                INNER JOIN TAXCATEGORIES TXC ON TX.CATEGORY = TXC.ID 
                INNER JOIN PAYMENTS P ON P.RECEIPT = R.ID
                INNER JOIN TICKETS ON R.ID = TICKETS.ID 
--                LEFT JOIN (SELECT TL.TICKET, SUM(TL.UNITS) 'Sold Units' FROM TICKETLINES TL  GROUP BY TL.TICKET)  SQ ON T.ID = SQ.TICKET
                CROSS JOIN (SELECT SUM(TL.UNITS) 'Sold Units' FROM TICKETLINES TL WHERE  TICKETS.ID = SQ.TICKET)  SQ 

GROUP BY CASE 
    WHEN @PERIODTYPE = 'W' THEN DATE_FORMAT(R.DATENEW,'%u')
    WHEN @PERIODTYPE = 'M' THEN DATE_FORMAT(R.DATENEW,'%Y-%m')
    WHEN @PERIODTYPE = 'Y' THEN DATE_FORMAT(R.DATENEW,'%Y')
    ELSE DATE_FORMAT(R.DATENEW,'%Y-%m-%d')
  END
ORDER BY R.DATENEW

【问题讨论】:

  • 您使用的是哪个版本的 MSSQL?
  • 好的,我已经删除了我的答案。
  • 我只是比较了 MSSQL 和 MySQL 的可能性。
  • 我认为您不能在子查询中使用“上层选择”的表别名..别名必须在同一级别.. subelect 不是 JOIN
  • 如何解决这个问题?

标签: mysql sql


【解决方案1】:

该查询在 mysql 中不起作用,因为 mysql 不能使用声明的别名和上级尊重子查询..

在交叉连接中的子查询中

CROSS JOIN (SELECT SUM(TL.UNITS) 'Sold Units' 
         FROM TICKETLINES TL WHERE T.TICKETID = TL.TICKET)  SQ

您使用 T.TICKETID

别名T

  INNER JOIN TICKETS T ON R.ID = T.ID  

在子查询范围内无法“访问”的地方声明..

如果可能的话,我建议你构建一个不引用 T 别名的子查询。尝试(如果可能)构建一个没有别名的等效子查询

【讨论】:

  • 我也使用了表名而不是别名。结果是一样的。我认为这是mysql的限制。
  • 如果可以请在没有别名的情况下发布查询,以便我进行评估
  • 否 ...不在评论中 ...在这种情况下,您应该更新/编辑您的问题,添加新代码..最终标题为 Update 1
猜你喜欢
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
  • 1970-01-01
  • 1970-01-01
  • 2019-02-20
  • 1970-01-01
  • 2022-10-15
相关资源
最近更新 更多