所以我处理了一些表格,这些表格都是由一个普通的表格生成的。
他们的模式是
T1: A, B, C, M, N
T2: A, B, J, M
T3: A, C, M, P
,预期结果是丢弃重复值的所有表的连接版本。
R: T1.A, T1.B, T1.C, T2.J, T1.M, T1.N, T3.P
幸运的是,行的属性在同名列上重合,即。
所有行 T1.A == T2.A == T3.A
T1.B = T2.B
等
将这些表连接到单个R
表中的查询是什么,只保留上面唯一命名的列?
答案 0 :(得分:1)
select T1.A, T1.B, T1.C, T2.J, T1.M, T1.N, T3.P
from t1 join t2
on t1.A = t2.A and t1.B = t2.B and t1.M = t2.M
join t3 on
t1.A = t3.A and t1.C = t3.C and t1.M = t3.M
你必须join
表。
答案 1 :(得分:1)
基本查询将是:
SELECT T1.A, T1.B, T1.C, T2.J, T1.M, T1.N, T3.P
FROM T1
INNER JOIN T2 ON T1.A=T2.A and T1.B=T2.B and T1.M=T2.M
INNER JOIN T3 ON T1.A=T3.A and T1.C=T3.C and T1.M=T3.M
您在每个内部联接上放置的条件数应该等于使其成为该表的唯一行的所有列。例如,如果A,B和M足以使其唯一,那么您必须使用它们。索引覆盖范围(作为单独或彻底的群集)应该包含这些使它们一起唯一的字段。
答案 2 :(得分:0)
虽然其他解决方案是正确的,但更优雅的版本将是
SELECT * FROM T1
NATURAL JOIN T2
NATURAL JOIN T3