如何使用SQL Server子查询语法将两个表连接在一起并删除重复项?

oug3syen  于 2022-10-03  发布在  SQL Server
关注(0)|答案(1)|浏览(255)

我有两张表,结构如下,

表A

province_id
1
1
1
1
1
2
2
2
2
2
3
3
3
3
3
.
.
.

表b

f_name       city_value        label
 city_id       1            Austin
 ac_id         1            Mayor: Jason Lee
 df_id         1            Republican
 ef_id         1            Property tax is high
 city_id       2            Dallas
 dfg_id        2            Mayor: ABC
 fth_id        2            Republican-3
 tpr_id        2            Property tax is low
city_id        3            Waco
 ddd_id        3            Mayor: DEF
 ers_id        3            Republican-4
 qws_id        3            Property tax is middle
city_id        4            Arlington
 zxg_id        4            Mayor: HGR
 zUg_id        4            Republican+4
   .
   .
   .

1.第一个表名为a,它只有1列province_id
(它有重复项,几乎有1500000行,唯一值几乎是200)
1.第二个表名为b,它有3列:(b表是纵向数据,总行将近400000)

  • 表b中的第1栏称为f_name,该变量的值与第3栏label相关联。

例如,当f_name=City_id且City_Value=1时,那么Label`l=Austin(城市名称)。
当f_name=City_id且City_Value=2时,则标签=Dallas(城市名称)。
当f_name=City_id且City_Value=3时,则Label=Waco(城市名称)。
当f_name=City_id且City_Value=4时,则Label=Arlington(城市名称)。

  • 表b中的第2列称为city_value,与province_id一样,它也有重复项。例如,对于特定的城市“奥斯汀”,其City_Value为1。
  • 表b中的第三列称为label,该变量下的内容是关于特定省份的城市信息。

在每个city_value中,变量label的单元格内容是唯一的。在每个city_value内的所有单元格中,感兴趣的是城市名称(例如,奥斯汀)。

我想要的是:

1.对于a表,请在重复数据删除后去掉province_id列的重复项,a表应该是这样的

Table a
    province_id
    1
    2
    3
    .
    .
    .

1.对于b表,请保留所有city_value和城市名称的数据记录;去重后,b表应该是这样的

f_name       city_value        label
     city_id       1            Austin
     city_id       2            Dallas
     city_id       3            Waco
     city_id       4            Arlington
       .
       .
       .

1.使用公共密钥(去重复的province_idcity_value)将(1)和(2)的结果连接在一起,所得到的数据记录应该等于去重复的province_id的数目。事实上,唯一的PROMENT_ID只有200左右,而经过重复数据删除后的总行仍然是200000行左右。换句话说,重复数据消除后,表a的总行范围远远小于表b。
1.如果我想获得相同的结果,我如何编写一个CTE(公用表表达式)代码来在SQL Server中实现这一点?

很明显,像“奥斯汀”、“达拉斯”、“韦科”、“阿灵顿”这样的城市正是我所需要的。

我下面的代码不正确,因为在连接两个表之后,重复项仍然存在。

SELECT DISTINCT a.province_id, b.label
       FROM a
       JOIN b ON 
        a.province_id=b.city_value;
nimxete2

nimxete21#

您可以首先从表中删除所有不需要的行

SELECT a.province_id, b.label
       FROM (SELECT DISTINCT province_id FROM a) a
       JOIN (SELECT city_value,label FROM b WHERE  f_name = 'city_id') b ON 
        a.province_id=b.city_value;

或至少从表a中删除所有重复项

SELECT a.province_id, b.label
       FROM (SELECT DISTINCT province_id FROM a) a
       JOIN b ON 
        a.province_id=b.city_value
WHERE  f_name = 'city_id';

相关问题