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;

这应该与原始查询一样快地执行(这可能利用了索引。

关于mysql - 解决MySQL不明确的列,不加前缀表名,不使用子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40329197/

相关文章:

PHP/MySQL/AJAX - 更新多个数据

javascript - 如何在 php 的表格中实现爆炸功能?

mysql - CURRENT_TIMESTAMP 可以在 INSERT 或 UPDATE 命令中更改吗?

sql - SQL Server 中 SUM() 的对应项是什么?

mysql - 两个表的左外连接

SQL 设置变量以选择结果

utf8_swedish_ci 的 mysql 字符长度

sql - 如何组合列中略有不同的多个表

mysql - Rails - SQL - 连接和合并

mysql - 隐私问题-数据库