连接表并选择一对多的一个值
Join tables and choose one value of one to many
我需要连接两个表,但可能存在多个匹配项
t1 t2
A B A C
1 x 1 0
2 x 1 1
3 x 2 0
4 x 3 1
5 x 4 1
6 x 4 0
5 0
6 1
现在我需要一个来自 t1 和 t2 的左连接选项,如果在选定的 A 上有 C 0 和 1,那么 C 必须是 0 (for A=1 and A=4)
。
所以结果应该是:
t3
A B C
1 x 0
2 x 0
3 x 1
4 x 0
5 x 0
6 x 1
这可能吗?
提前致谢。
您可以通过加入和分组来完成:
SELECT t1.a,t1.b,MIN(t2.c)
FROM t1
LEFT JOIN t2
ON(t1.a = t2.a)
GROUP BY t1.a,t1.b
MIN()
从每个组的所有结果集中选择最小的,因此如果 1
和 0
都将返回,MIN()
将显示 0
因为它更小。
SELECT t1.A, B, C
FROM t1
LEFT OUTER JOIN
( SELECT A, C
FROM (
SELECT A, C,
ROW_NUMBER() OVER ( PARTITION BY A ORDER BY C ) AS rn
FROM t2
)
WHERE rn = 1
) t2
ON ( t1.A = t2.A )
或
SELECT t1.A, B, C
FROM t1
LEFT OUTER JOIN
( SELECT A, MIN(C) AS C
FROM t2
GROUP BY A
) t2
ON ( t1.A = t2.A )
我需要连接两个表,但可能存在多个匹配项
t1 t2
A B A C
1 x 1 0
2 x 1 1
3 x 2 0
4 x 3 1
5 x 4 1
6 x 4 0
5 0
6 1
现在我需要一个来自 t1 和 t2 的左连接选项,如果在选定的 A 上有 C 0 和 1,那么 C 必须是 0 (for A=1 and A=4)
。
所以结果应该是:
t3
A B C
1 x 0
2 x 0
3 x 1
4 x 0
5 x 0
6 x 1
这可能吗? 提前致谢。
您可以通过加入和分组来完成:
SELECT t1.a,t1.b,MIN(t2.c)
FROM t1
LEFT JOIN t2
ON(t1.a = t2.a)
GROUP BY t1.a,t1.b
MIN()
从每个组的所有结果集中选择最小的,因此如果 1
和 0
都将返回,MIN()
将显示 0
因为它更小。
SELECT t1.A, B, C
FROM t1
LEFT OUTER JOIN
( SELECT A, C
FROM (
SELECT A, C,
ROW_NUMBER() OVER ( PARTITION BY A ORDER BY C ) AS rn
FROM t2
)
WHERE rn = 1
) t2
ON ( t1.A = t2.A )
或
SELECT t1.A, B, C
FROM t1
LEFT OUTER JOIN
( SELECT A, MIN(C) AS C
FROM t2
GROUP BY A
) t2
ON ( t1.A = t2.A )