在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)......?
答案 0 :(得分:5)
我建议您在相关表格中使用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
答案 1 :(得分:2)
SQL 101:
SELECT
column1,
r.RelatedColumn
FROM tbl_primary a1
JOIN tbl_related r
ON r.record_id = a1.recordId
答案 2 :(得分:2)
您应该使用JOIN
子句
SELECT a1.column1,
rt.RelatedColumn
FROM tbl_primary a1
LEFT JOIN tbl_related ON a1.record_id = rt.record_id