【发布时间】:2013-10-30 11:59:43
【问题描述】:
我有一个如下的选择查询:
SELECT * FROM A
LEFT JOIN B ON B.x = A.y
LEFT JOIN C ...
WHERE ....
GROUP BY ...
ORDER BY ...;
所有表都有id 列并且查询运行良好。结果有许多 id 列没有错误,驱动程序处理模棱两可的问题。但我需要对结果有限制,所以我用另一个选择查询包装它,如下所示:
SELECT * FROM (
SELECT * FROM A
LEFT JOIN B ON B.x = A.y
LEFT JOIN C ...
WHERE ....
GROUP BY ...
ORDER BY ...
) AS x WHERE 1 LIMIT 1000;
现在我得到Duplicate column name 'id' 错误!
PS:完整的查询很复杂,我需要使用*(不能列出列名),由于joins、group by order by等原因,我不能在主查询中使用limit。
【问题讨论】:
-
为什么列列表不可能?
-
好吧,您必须列出所有列名以及不明确列的供应和别名。
-
您的内部查询中是否有任何类型的分组/包含子句?如果没有,为什么不将
limit 1000添加到您的第一个查询中? -
人们很少需要使用
SELECT *,并且在生产代码中使用它从不是一个好主意,而且几乎在所有情况下都是只是懒惰。我敢打赌,自从您提出这个问题后的 42 分钟内(我评论时没有答案),您本可以写出您需要的所有列。这样做的好处不仅是消除了重复列错误,它还可以在未来证明您的列位置不受 DDL 更改(例如添加新列或删除列)的影响,它还将减少服务器上的 I/O 和网络流量。 -
多年来,我从未遇到过需要在一个查询中加入 50 个表。