SQL查询连接两个没有重复值的表?

时间:2018-06-14 19:02:11

标签: mysql sql distinct

Table 1                          
ID | NAME | WARD_ID|         
1     A      1         
2     B      1         
3     C      2           
4     D      2 

Table 2           
ID | MONTH1 | MONTH2 | WARD_ID|         
1     9          10        1         
2     6          11        1         
3     5          12        2           
4     13         14        2 

我想加入这两个表并产生以下输出:

ID | NAME | MONTH1 | MONTH2 | WARD_ID|         
1      A       9       10        1         
2      B       6       11        1         
3      C       5       12        2           
4      D       13      14        2 

在查询的ON条件中,我必须保持两个表的WARD_ID相等。我无法弄清楚解决方案。任何人都有这样的查询经验吗?

3 个答案:

答案 0 :(得分:1)

我想你想要这样的东西:

select t1.*, t2.*
from (select t1.*,
             (@rn1 := if(@w1 = ward_id, @rn1 + 1,
                         if@w1 := ward_id, 1, 1)
                        )
             ) as rn
      from (select t1.* from table1 t1 order by ward_id, id ) t1 cross join
           (select @w1 := -1, @rn1 := -1) params
     ) t1 join
     (select t2.*,
             (@rn2 := if(@w2 = ward_id, @rn2 + 1,
                         if@w2 := ward_id, 1, 1)
                        )
             ) as rn
      from (select t2.* from table2 t2 order by ward_id, id ) t2 cross join
           (select @w2 := -1, @rn1 := -1) params
     ) t1
     on t2.ward_id = t1.ward_id and t2.rn = t1.rn;

子查询枚举每个表中的行。 join然后使用枚举。

使用row_number()在MySQL 8.0中更简单。

答案 1 :(得分:0)

我在这里假设ID在两个表中都是相同的。如果是这样,我认为你可以做多条件加入:

select * from table1 t1
inner join table2 t2
on t1.ID=t2.ID and t1.WARD_ID=t2.WARD_ID

答案 2 :(得分:0)

您可以执行以下操作:

SET @rn:=0;
SET @rn2:=0;
SELECT * 
FROM (
  SELECT @rn:=@rn+1 AS rn1, t1.ID, t1.NAME, t1.WARD_ID
  FROM t1
  GROUP BY t1.WARD_ID, t1.NAME
  ORDER BY t1.WARD_ID, t1.NAME
) s1
INNER JOIN (
  SELECT @rn2:=@rn2+1 AS rn2, t2.ID, t2.MONTH1, t2.MONTH2, t2.WARD_ID
  FROM t2
  GROUP BY t2.WARD_ID, t2.MONTH1,t2.MONTH2
  ORDER BY t2.WARD_ID, t2.MONTH1,t2.MONTH2
) s2 ON s1.WARD_ID = s2.WARD_ID
  AND s1.rn1 = s2.rn2

但它确实无法对表进行可靠的排序以便每次都加入相同的行。我仍然认为每次加入两个表都没有可靠/可重复的方法。

=============================================== =============

http://sqlfiddle.com/#!9/aa2db0/1<<<<如果ID可用于可靠地对两个表进行排序,则可以在ORDER BY中使用它。我已将其添加到此Fiddle中,并在设置中包含将落在现有记录之前并可能更改排序的行。这还包括Table 2中的记录多于Table 1中的记录,因此可能会导致重复的行。这些新行被忽略,因为它们不能在表之间匹配。