我有一个查询,这是失败与一个模棱两可的列错误。不幸的是,由于我使用的框架(Magento 1),我不能仅仅通过在'where'子句中用正确的表名前缀列名来解决这个问题。
给定两个示例表
T1 = colA | colB | colC
T2 = colD | colB | colE
我想要一个查询,它将连接colA
和colD
上的表,只选择colC
和colE
,但在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;
这应该执行得和原始查询一样快(可能是利用了索引)。