我们在语句中加入Having()语句来过滤出非冗余数据.</p> SELECT LastName, FirstName, COUNT(*)" ?. m* U+ r+ p1 P- }
FROM Customers9 g) v/ m+ M, t Y$ ^
GROUP BY LastName, FirstName% z9 U' P( {8 O7 {) \- j
HAVING COUNT(*) > 1;) R/ Q$ S6 |; c* h' a0 U
SQL
" X+ E: r! z$ {. R, w Listing 3. 过滤冗余* U. ^- D9 M7 X8 n
加入Having()语句来过滤出非冗余数据.% H+ n% ~2 o8 i- N T9 ^; ?
LASTNAME FIRSTNAME COUNT(*)
0 e& _' l9 M& |2 t; O' T --------------- ---------- ----------
; Q8 i8 p4 l z! N! H% g* _0 U Krieger Jeff 37 k. {6 @$ w, ?6 a) b
Simon Michael 27 d b) x! y' A2 v4 b
Stone Tony 5
% H$ r- F8 w9 }& N0 i* e! Z1 V7 X 3 rows selected.Listing 3显示了以上代码的输入,尽管如此,这些查询结果并没有显示出能标识每一行的字段,我们将上一语句做为一个嵌套查询来显示标识这些记录的IDSELECT ID, LastName, FirstName
- L& M5 W" D N3 c9 r+ f FROM Customers
- n% _! U1 ?. H, c+ ~ WHERE (LastName, FirstName) IN (SELECT LastName, FirstName
F- }& P4 s1 U+ W G8 F: ]2 k4 ` FROM Customers+ _1 ^! e' {- b- [0 |9 \4 ^# y
GROUP BY LastName, FirstName
2 H, t' A$ r! V4 d' n! z HAVING COUNT(*) > 1)
$ s( S9 R4 l, c% A% D: F$ N1 @ ORDER BY LastName, FirstName;2 b* \8 P6 B& w
Listing 4显示出了以上代码的结果,这些查询显示了有三组冗余,共有十行,我们应该保留这些组中的1005,1009,1001这些记录然后删除1012,1017,1010,1011,1016,1019,1014这些冗余的条目.
; l" a" g R8 }5 v8 m SQL
7 @; c% N6 |, T( T- I6 j W6 w Listing 4. 找出唯一的键& p' e+ R! U; K% _. t
语句的输出
}& M% k, `# D ID LASTNAME FIRSTNAME! E- I" Q% f( }! W7 d; l) c
----- --------------- ---------- q4 T6 F7 {* | N
1005 Krieger Jeff7 `8 x) f# E# Q- k
1012 Krieger Jeff
# \4 K q" d$ f% P 1017 Krieger Jeff/ s1 y/ f8 ?1 N) P7 ?
1009 Simon Michael
2 q: n% c2 P# `1 H% D: [ 1010 Simon Michael/ B" H$ v2 C! M! A- k1 @
1001 Stone Tony
6 ?+ m1 `" a/ Y' {8 l+ O: k 1011 Stone Tony$ @8 l$ q; L1 c8 I
1016 Stone Tony
8 ^! }6 ]' d* `" l( ` 1019 Stone Tony
% E9 O" J* w9 w4 H 1014 Stone Tony
3 g3 B! D: X9 {' F3 ? ^ 10 rows selected.
- w9 @- h) N& X1 d4 { Oracle公司给出的一个解决方案
: H, G& b; u1 G7 N: I% w% C Oracle 公司给我们提供一个见删除冗余数据的一个方案,这个方案使用了Oracl
/ s- g. G% W7 n. l, {2 N& \% p e公司自己的一个集合函数MIN()或者MAX()来解决这一问题MIN()函数可以得
& c4 c1 U- I$ {. O9 L3 ^3 M4 ? 到每一组中(冗余的非冗余的),应保留的所有值.(正如我们所见,输入出不包含那些大I
" ?1 [: _+ _" H" M) L+ b D的冗余值
4 E" E$ p5 H5 S% D SELECT MIN(ID) AS ID, LastName, FirstName! i r: t, |* G7 b W4 {
FROM Customers
7 j' w- T! o4 D6 n! L* \ GROUP BY LastName, FirstName;& L; m: p3 ~5 o3 X
这一条命令的输出! G1 p6 V1 M* K- R' \. S
# t4 D2 I( T5 }2 N+ f+ O/ K |