2010-12-13 33 views
2

les instruction suivante renvoie ceci:imbriquées déclarations de suppression/sql

select rowid,name,compound,COUNT(*) from qvalues where rowid in (select rowid from batchinfo where instrument='tf1') 
group by rowid,name,compound 
having COUNT(*)>1 



rowid name compound (No column name) 
19300 QC1 ETG 2 
20379 QC4 ETS 2 
20686 QC2 ETG 2 
19402 QC1 ETG 2 
23605 QC1 ETG 2 
21705 QC3 ETS 2 
23678 QC1 ETG 2 
18480 QC2 ETG 2 

..... ...... .....

j'ai une autre table appelée qvalues:

rid name compound rt response finalConc qvalue rowid 
229263 QC3 Hydromorphone 0.69 6228.00 82.53 98 4695 
229264 QC3 Morphine 0.51 3168.00 119.89 99 4695 
229265 QC3 Oxymorphone 0.57 2472.00 83.89 99 4695 
229266 QC3 Benzoylecgonine 2.17 20439.25 85.99 95 4695 
229267 QC3 Codeine 1.34 4829.00 82.85 96 4695 
229268 QC3 Hydrocodone 1.58 12416.00 84.99 94 4695 
229269 QC3 Oxycodone 1.47 5430.00 78.44 94 4695 
229270 QC3 Buprenorphine 2.54 366.13 10.41 98 4695 
229271 QC3 Mepbrobamate 2.50 1330.34 95.56 92 4695 
229272 QC3 Methadone 2.68 85897.27 86.77 92 4695 

ce que je dois faire est de prendre la combinaison des ROWID, NOM, COMPOSE du premier set et ne garder que la première occurrence de celui-ci dans le deuxième set. J'ai besoin de supprimer toutes les autres lignes qui ont la combinaison de ROWID, NAME et COMPOUND du composé. J'ai besoin de garder cette combinaison où le RID est le plus petit.

s'il vous plaît laissez-moi savoir si je dois préciser ou

+1

S'il vous plaît poster le code que vous avez écrit jusqu'à présent. Les gens n'aiment généralement pas écrire votre code pour vous. Comme c'est, c'est une description de travail, pas une question. –

+0

Je pense que vous pouvez poser cette question trop de fois (http://stackoverflow.com/questions/4434118/select-statement-to-find-duplicates-on-certain-fields). Utilisez simplement ma réponse à cette question dans une instruction DELETE et vous avez votre solution. Nous devrions probablement fermer celui-ci ... –

Répondre

0

Je crée un alias de table sur la deuxième série, le regroupement par nom, composé, ayant MIN (rowid), puis rejoindre que pour la première série.

Ensuite, supprimez tout ce qui n'est pas dans cet ensemble en utilisant NOT IN.

+0

merci beaucoup c'est une bonne idée pouvez-vous m'aider à le mettre en œuvre –

+0

Bien sûr, montrez-moi ce que vous avez jusqu'ici et je serais heureux de le faire. – Sam

0

Donc, vous voulez supprimer tout ce qui est en batchinfo sauf le record avec le plus petit ... débarrasser

delete qvalues where rid in 
    (select rid 
    from qvalues 
    where rowid in (select rowid from batchinfo where instrument='tf1') 
    except 
    select rid 
    from (select rid=min(rid) 
     from qvalues 
     where rowid in (select rowid from batchinfo where instrument='tf1') 
     group by rowid,name,compound) x); 

count> 2 est pas nécessaire car avec count = 1, il est toujours le record avec la smalles débarrasser.

+0

Syntaxe incorrecte près de ')'. –

+0

@herrow Désolé, mais il n'y a pas de syntaxe incorrecte (au moins dans SQL Server 2008 SP2) –