Vérifiez avec l'exemple de vérification des données en double.
** table des utilisateurs **
| id | name | address | 
|---|---|---|
| 1 | sasaki | tokyo | 
| 2 | itou | fukuoka | 
| 3 | fujita | nagasaki | 
| 4 | sasaki | osaka | 
| 5 | itou | nagano | 
Par exemple, supposons que vous ayez une table comme celle ci-dessus. Je veux récupérer des enregistrements avec des noms en double et vérifier l'adresse.
sql1: sélectionnez-en un avec un nom en double
SELECT name FROM users GROUP BY name HAVING  count(name) > 1
résultat
| name | 
|---|
| itou | 
| sasaki | 
Dans ce cas, nous ne connaissons pas chaque adresse, donc en fonction de ce résultat, exécutez SQL comme suit.
sql2: basé sur des résultats en double
SELECT * FROM users WHERE name IN ('itou', 'sasaki') ORDER BY name
résultat
| id | name | address | 
|---|---|---|
| 2 | itou | fukuoka | 
| 5 | itou | nagano | 
| 1 | sasaki | tokyo | 
| 4 | sasaki | osaka | 
Comme indiqué ci-dessus, chaque adresse peut également être obtenue.
Donc sql1 et sql2 sont combinés dans une sous-requête.
sql3: sous-requête (sql1,sql2)
SELECT * FROM users WHERE name IN (
  SELECT name FROM users GROUP BY name HAVING  count(name) > 1
  ) 
ORDER BY name
Peut être écrit comme
Tout contrôleur
duplicates = User.select(:name).group(:name).having("count(name) > 1")
@users = User.where(name: duplicates)
SQL à exécuter
SQL exécuté par Rails
 SELECT "users".* FROM "users" WHERE "users"."name" IN (
   SELECT "users"."name" FROM "users" GROUP BY "users"."name" 
   HAVING (count(name) > 1)
 )
Étonnamment, un seul SQL est émis.
Référence (assez facile à comprendre!) Gestion des sous-requêtes avec l'opérateur IN d'ActiveRecord (Oakbow)
Recommended Posts