2010-11-09 77 views
1

我知道足够的SQL来编写基本的SELECTUPDATE s。我在努力JOIN s更新结果GROUP BY

我想更新犯罪表中的'县'字段。我正在使用一个zip_xref表,它会给我县名。问题在于数百个城市在多个县,我想更新最普遍的县的表,所以我的子查询必须按照大小排列县。

我写这个是为了找到按照每个县的邮政编码排列的县名。

SELECT DISTINCT CountyName AS counties, COUNT(*) AS numZips 
FROM Zip_XRef WHERE (CityName = 'Aurora') AND (StateName = 'Colorado') 
GROUP BY CountyName ORDER BY numZips DESC 

我知道这个更新不起作用,它只是想法。

UPDATE crime_table_08 AS c 
SET county = 
    (SELECT TOP 1 DISTINCT CountyName, COUNT(*) AS numZips 
    FROM Zip_XRef AS z 
    WHERE RTRIM(z.StateName) = RTRIM(c.State) AND RTRIM(z.CityName) = RTRIM(c.city) 
    GROUP BY CountyName ORDER BY numZips DESC 
    ) 

我在想,我需要创建一个临时表,然后调用它来更新C,我不能完全得到我的头周围的逻辑。任何帮助不胜感激。

或者,有没有人认为有更好的办法?

回答

1
UPDATE c 
SET county = t.CountyName 
FROM crime_table_08 AS c 
CROSS APPLY (
    SELECT TOP (1) CountyName 
    FROM (
     SELECT CountyName, COUNT(*) as cnt 
     FROM Zip_XRef AS z 
     WHERE RTRIM(z.StateName) = RTRIM(c.State) AND RTRIM(z.CityName) = RTRIM(c.city) 
     GROUP BY CountyName) 
    ) AS s 
    ORDER BY cnt DESC) as t; 
+0

+1为获得一个合理的from子句 – 2010-11-09 23:36:37

+0

对不起,应该提到,我在WIN服务器2003/SQL 2000这将是什么样的作为内加入? – royhink 2010-11-10 18:47:58

+0

不能有相关的内部联接(即,具有引用'c'别名中的字段的WHERE子句的联接)。你可以使用子查询,但它会很快变得非常混乱。稍后我会试着发布一个解决方案,当我花一分钟时间看看它。 – 2010-11-10 18:51:10