1、SQLクエリ重複しない記録方法

1914 ワード

設計のため、重複しない記録値を調べる必要があります.このような問題は、皆さんが経験したことがあると思います.すぐにGOOGLEを見てみると、このような問題はまだ多く、解決策も少なくありません.よく見てください.
たとえば、次の表構造と値--table
fid
name
sex
1
a

2
b

3
c

4
d

5
a

6
b

シナリオ1:distinct
 select distinct name from table

結果:name a b c dは効果を実現しますが、他の記録を同時に開くとしたら?もう一度やってみる
 select distinct name,id from table

テストには効果がありません.調べてみると、実際にはnameとidフィールドが重複してフィルタされていることがわかります.
検索を続行するには、次の方法があります.
シナリオ2:groupby
 select *, count(distinct name) from table group by name

Oracleではテストに失敗し、MYSQLで合格したそうです.やってみる
select min(fid),name,sex from table group by name    ,

現実は以下の結果である:fid name sex 1 a男2 b男3 c女4 d女
考え続けて、すべてのレコードを開くには、フィールドを指定しないで(*)、この方法はだめらしい!
select * from table where fid in(Select min(fid) FROM table group by name)

テスト成功fid---name-----sex 1-----a-----男性2-----b-----男性3-----女性4-----女性
シナリオ3:もともとすでに終わって、突然前の数日ネット上で調べてデータの中ですべてのあるフィールドの重複しない記録を調べたことを思い出します
 select   *   from   table   
 where name in(select name from table group by name having count(name)=2)

fid name sex 1 a男性2 b男性5 a男性6 b男性がこのように推定された.
 select * from table   
  where name in(select name from table group by name having count(name)=1)

道理で大丈夫です.みんなやってみてください.どんなに多くのフィールドが現実的です.ネット上の方法distinct、Inner Joinなどを振り返ると、面倒で、大きな限界がある.
以下にまとめる.
  • select distinct name from table重複しない単一フィールド
  • を開く.
  • select * from table where fid in(Select min(fid) FROM table group by name)重複しないすべてのフィールド値
  • を開く.
  • select * from table where name in(select name from table group by name having count(name)=1)任意の回数を繰り返す全記録
  • を開く.