【问题标题】:Issue with SQL join querySQL 连接查询的问题
【发布时间】:2017-10-18 13:41:41
【问题描述】:

这是我的查询的简化版本。它在 SQLite 中运行没有问题,但在 MYSQL 中则不然。

错误:“on 子句”中的未知列“tab2.key”

SELECT 
  tab2.key AS remarksId, 
  tab1.sessionDate AS date, 
  tab1.sessionStart AS startTime
FROM 
  table1 AS tab1, 
  table2 AS tab2, 
  table3 AS tab3, 
  table4 AS tab4
INNER JOIN 
  table5 AS tab5 
  ON 
    tab5.remarkId = tab2.key 
  WHERE 
    tab1.userId='<anyNumber>' AND 
    tab2.objectiveId='<anyKey>' AND 
    tab1.reportId=tab2.reportId AND 
    tab1.reportId=tab3.key AND 
    tab4.key=tab3.sortieId 
ORDER BY date, startTime;

不幸的是,将列放入 ` 并没有帮助。

我不确定将列命名为“键”是否是一种好习惯 (MYSQL Keywords),但由于现有安装,我必须以某种方式处理这个问题。为了快速测试,我重命名了“key”列,但也没有任何成功。

非常感谢

【问题讨论】:

  • 不要混合连接符号。引擎可以处理 ANSI 89 或 ANSI 92,而不是两者。我建议更改您的 , 连接表示法以使用内部连接表示法。
  • 为什么要混合连接类型?您应该只使用 JOIN 语法与 INNER、LEFT、RIGHT 等。为什么要使用旧式的逗号分隔连接?
  • 你为什么要为 tab2.key 做一个别名(作为备注 ID)然后根本不在连接中使用它?
  • 可能是愚蠢的评论...但是您是否在正确的架构上执行该 SQL?

标签: mysql sql sqlite inner-join


【解决方案1】:

简单地说,不要混合连接符号,如果可以选择使用当前的 ANSI 92 连接语法而不是 89 标准(是的......那是 1992 年和 1989 年!)

其次...别名是为了帮助您节省输入并处理对同一个表的多个引用...所以...简化名称 t1、t2、t3...

最后...如果您必须在 mySQL 中使用保留/限制字词,请使用反引号。

SELECT t2.`key` AS remarksId 
FROM table1 t1
INNER JOIN table2 t2
   ON t1.reportId = t2.reportId 
INNER JOIN table3 t3
   ON t1.reportId = t3.`key`  
INNER JOIN table4 t4
   ON t4.`key` = t3.sortieId 
INNER JOIN table5 t5
   ON t5.remarkId = t2.`key`
WHERE t1.userId = '<anyNumber>' 
  AND t2.objectiveId = '<anyKey>'  
ORDER BY `date`, startTime;

【讨论】:

  • 你打败了我!
  • @da-chiller 逗号表示交叉连接。它是 current 语法。但它不像显式连接那样紧密绑定。有反对逗号的文体论点(包括其他遭受误解的人),但“不要混合”的论点是似是而非的。 (在 5.0.12 之前,MySQL 没有实现较低的优先级。)
猜你喜欢
  • 1970-01-01
  • 2014-06-04
  • 2014-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-05
相关资源
最近更新 更多