4

在 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)...?

4

3 回答 3

5

我建议您使用LEFT JOIN相关表。因为如果您使用 a JOINthen 如果 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
于 2012-04-27T12:05:39.587 回答
2

SQL 101:

SELECT 
    column1,
    r.RelatedColumn
FROM tbl_primary a1
JOIN tbl_related r
ON r.record_id = a1.recordId
于 2012-04-27T12:04:11.460 回答
2

您应该使用该JOIN子句

 SELECT a1.column1,
        rt.RelatedColumn
 FROM tbl_primary a1
 LEFT JOIN tbl_related ON a1.record_id = rt.record_id
于 2012-04-27T12:08:16.477 回答