使用具有重复值的列连接两个表,即master -lookup表

时间:2009-12-14 03:50:41

标签: sql

我有一个表(x),其中有900万行,其中一列是cosub,它有重复的重复值,还有另一个表(y),其中包含cosub的相关详细信息 它有59k行和其他列,提供与cosub相关的详细信息(充当查找表) 我如何加入这两个表,查询900万行,并从表(y)中选择cosub的其他细节。 例如:

Table x      table y 
id cosub    cosub div 

1   A        B     6
2   B        A     5
3   C        C     7
4   A        A     5
5   B        B     6
6   C        A     5
.....................

查询的结果应如下所示(从表x中选择所有900万行)

1 A 5
2 B 6
3 C 7
4 A 5
5 B 6
6 C 7

2 个答案:

答案 0 :(得分:1)

SELECT DISTINCT X.id, X.cosub, Y.div
FROM X
LEFT OUTER JOIN Y ON Y.cosub = X.cosub
-- WHERE  xxxx here for optional where condition
-- ORDER BY xxxx  here for optional ordering clause

我不是100%确定你需要DISTINCT(最好避免它),这取决于小表是否有重复。问题的文本似乎暗示没有这样的重复,但是然后示例给出了重复...

还要注意,如果表Y具有给定cosub的多个div值(即给定cosub的div值具有冲突的几个记录),则上述查询将导致在结果列表中显示多行,每个不同一行值(但重复表X中的数据)。

最后,建议使用片段和LEFT OUTER JOIN,这将允许结果包含仅包含表X中数据的记录(以及代替通常来自Y的字段值的空值),以防给定X记录具有在Y中找不到的cosub值。替代方法是使用简单的JOIN,这将具有从结果列表中排除任何此类记录的效果(即,结果将仅包括来自X的记录,前提是它们具有存在的cosub在Y)

答案 1 :(得分:1)

使用:

   SELECT DISTINCT
          x.id,  
          x.cosub,
          y.div
     FROM TABLE_x x
LEFT JOIN (SELECT t.cosub,
                  t.div,
                  --other columns
             FROM TABLE_Y t) y ON y.cosub = x.cosub

从我读过的评论中,你需要预先处理TABLE_Y中的记录,以便在返回结果集之前获得正确的div / etc值。