在 MS SQL Server 中,此查询正常运行:
SELECT column1
, (SELECT RelatedColumn1 FROM tbl_related WHERE record_id=a1.record_id) AS pseudocolumn1
, (SELECT RelatedColumn2 FROM tbl_related WHERE record_id=a1.record_id) AS pseudocolumn2
, (SELECT RelatedColumn3 FROM tbl_related WHERE record_id=a1.record_id) AS pseudocolumn3
, (SELECT RelatedColumn4 FROM tbl_related WHERE record_id=a1.record_id) AS pseudocolumn4
... [20 or more subqueries here] ...
FROM tbl_primary a1
然而,在 mySQL 中,它运行得非常慢——而且随着您添加更多子查询,性能会继续下降。我确定它与引擎盖下的操作顺序有关,但我的问题是如何优化此查询?如何将第二个表中的所有值转换为结果集中的列?希望这不必通过多个 JOIN 语句来完成(因为我不太了解 JOINS)...?
最佳答案
我建议您对相关表使用 LEFT JOIN
。因为如果您使用 JOIN
,那么如果 tbl_related 没有该 id 的行,那么该行将从结果中排除。
SELECT
column1,
tbl_related.RelatedColumn1,
tbl_related.RelatedColumn2,
tbl_related.RelatedColumn3,
tbl_related.RelatedColumn4,
tbl_related.RelatedColumn5
.....
FROM
tbl_primary a1
LEFT JOIN tbl_related
ON tbl_related.record_id=a1.record_id
你知道:
SELECT
(SELECT RelatedColumn1 FROM tbl_related WHERE record_id=a1.record_id)
AS pseudocolumn1
可能会在未来引起问题。如果您的子查询之一返回多个值会怎样?你可能会得到一个异常,说子查询不能返回更多的值。因此,如果您打算将来进行这样的子查询。至少在它们上面有一个 TOP 1
,这样查询就不会崩溃。像这样:
SELECT
(SELECT TOP 1 RelatedColumn1 FROM tbl_related WHERE record_id=a1.record_id)
AS pseudocolumn1
关于mysql - mySQL 中的子查询结构以获得最佳性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10350265/