解析MySQL不带表名前缀且不使用子查询的歧义列

  • 本文关键字:查询 歧义 MySQL 前缀 解析 mysql sql
  • 更新时间 :
  • 英文 :


我有一个查询,这是失败与一个模棱两可的列错误。不幸的是,由于我使用的框架(Magento 1),我不能仅仅通过在'where'子句中用正确的表名前缀列名来解决这个问题。

给定两个示例表

T1 = colA | colB | colC
T2 = colD | colB | colE

我想要一个查询,它将连接colAcolD上的表,只选择colCcolE,但在T1的colB上有一个where子句。直接的SQL语句如下:

SELECT colC, colE 
FROM T1 LEFT JOIN T2 ON colA=colD
WHERE T1.colB=1

问题是'where'子句已经由核心代码设置为WHERE colB=1,我不能轻易地改变它以添加T1前缀。

我试着把它重写成这样的子查询:

SELECT colC,colE 
FROM T1 LEFT JOIN (SELECT colD,colE FROM T2) ON colA=colD
WHERE colB=1

这工作,给我我所期望的,但它是不可接受的慢。

是否有任何聪明的SQL技巧可以用来优化子查询,或重写连接,以便我可以使用没有表前缀的where子句

这是如何执行的?

SELECT colC, colE 
FROM T1 LEFT JOIN
     T2
     ON colA = colD AND T1.colB = 1
WHERE T1.colB = 1;

另一种选择是像这样的子查询:

SELECT colC,
       (SELECT colE 
        FROM T2
        WHERE T1.colA = T2.colD
       ) as colE
FROM T1
WHERE colB = 1;

这应该执行得和原始查询一样快(可能是利用了索引)。

相关内容

  • 没有找到相关文章

最新更新