在左表中将LEFT OUTER JOIN限制为每个记录一个结果

时间:2015-10-14 15:42:54

标签: sql-server tsql

我正在连接两个表x和y(在下面定义),并根据是否找到至少一个匹配在结果集中创建一个新值。

create table x (foo int primary key, a int, b int)
insert x VALUES (1,2,3), (2,3,4), (3,NULL,5)

create table y (bar int primary key, a int, b int)
insert y values (8, 3, NULL), (11, 2, NULL), (12, NULL, 3)

表x是我的主要数据表,我想进一步传播。表x可以具有 a 值, b 值,或者 a 值和 b 值。表y是处理期间要标记的 a b 值的列表。表y具有 a b 值。即使表x中的记录与表y中的多个记录匹配,我仍然只想将其标记一次。

以下查询适用于我需要的内容。有没有更好的方法来编写它,特别是不使用DISTINCT关键字?

select DISTINCT x.*, case when y.bar is null then 0 else 1 end [Did I Get At Least One Match?]
from x left outer join y
    on ((x.a = y.a) or (x.b = y.b))

Results:
foo  a    b    Did I Get At Least One Match?
1    2    3    1
2    3    4    1
3    NULL 5    0

2 个答案:

答案 0 :(得分:0)

您还可以使用GROUP BY

SELECT      x.foo, x.a, x.b,
            match_count = COUNT(y.bar)
FROM        x
LEFT JOIN   y ON x.a = y.a OR x.b = y.b
GROUP BY    x.foo, x.a, x.b

答案 1 :(得分:0)

如果你不能使用DISTINCT那么子查询怎么样?

Toggle()

这是小提琴链接,http://www.sqlfiddle.com/#!3/cb6a2/9