我在SQL Server中有一个查询,我正在进行多个左连接。有一次我得到:
...LEFT JOIN foo on a.id = foo.id AND foo.code = 100
在查询中直到该连接语句,a.id
不会重复;每a.id
只有一行。但是表a
和foo
具有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.date1
和f.date2
的日期值。如果foo
没有这样的记录,那么我只想查看f.date1
和f.date2
的NULL值。
根据评论进行修改:
事实证明,表foo
实际上可以有多行a.id = foo.id and foo.code = 100
。
答案 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 BY
和TOP(1)
。