LEFT JOIN最多返回一行以获得1对多关系

时间:2016-03-22 23:18:47

标签: sql sql-server join

我在SQL Server中有一个查询,我正在进行多个左连接。有一次我得到:

...LEFT JOIN foo on a.id = foo.id AND foo.code = 100

在查询中直到该连接语句,a.id不会重复;每a.id只有一行。但是表afoo具有1对多的关系,因此在该连接语句之后,我得到多个具有相同a.id的行。

foo将始终有多个记录foo.id = a.id,但它可能有也可能没有foo.id = a.id AND foo.code = 100的记录。如果是这样,那么只有1个这样的记录。所以,我希望在最终查询结果中看到的每个a.id只有1行;如果foo的记录在f.id = a.id and f.code = 100,那么我希望从该记录中看到f.date1f.date2的日期值。如果foo没有这样的记录,那么我只想查看f.date1f.date2的NULL值。

根据评论进行修改

事实证明,表foo实际上可以有多行a.id = foo.id and foo.code = 100

1 个答案:

答案 0 :(得分:1)

一种可能的方法是使用OUTER APPLY

SELECT
    a.id
    ,OA_foo.date1
    ,OA_foo.date2
FROM
    a
    OUTER APPLY
    (
        SELECT
            -- TOP(1)
            foo.date1
            ,foo.date2
        FROM foo
        WHERE
            foo.id = a.id
            AND foo.code = 100
        -- ORDER BY ...
    ) AS OA_foo
;

如果您确定过滤器foo.id = a.id AND foo.code = 100 总是只返回一行(或没有行),那么您可以按原样保留查询。

如果嵌套查询可能返回的行多于行,并且您只想留一行,则指定适当的ORDER BYTOP(1)