SQL连接查询帮助 - 数据验证

时间:2014-02-24 14:12:25

标签: sql sql-server join

我在SQL Server 2008数据库中有一个包含两列,城市和区域的表。每个城市都有9个不同的区域值。例如,111,222,333,444,555,666,777,888,999。所以表格看起来像

 city,area
 city1,111
 city1,222
 .... 
 city1,999
 city2,111
 city2,222
 .....
 city2,999
 etc...

理想情况下,我喜欢每个城市和缺失区域的结果集。有没有办法编写一个可以执行此操作的select语句?

我意识到并非每个城市都有9个值,有61个城市至少缺少一个值,但我似乎无法确定缺少哪个值。

2 个答案:

答案 0 :(得分:2)

是的,你可以这样做。创建cityarea的所有组合,然后使用left outer join查找缺失的值。

select c.city, a.area
from (select distinct city from cityarea) c cross join
     (select distinct area from cityarea) a left outer join
     cityarea ca
     on ca.city = c.city and
        ca.area = a.area
where ca.city is null;

答案 1 :(得分:0)

请告知是否有任何样本数据不起作用。

declare @t table(city varchar(50),area int)
insert into @t values('city1',111),('city1',222),('city1',444),('city2',111),('city2',222),('city2',333)
,('city2',444),('city2',555),('city2',777)
;with CTE as
(select *,ROW_NUMBER()over(partition by city order by area)rn from @t
)
select * from cte a 
inner join cte b on a.city=b.city and b.rn-a.rn=1
where b.area-a.area>111