2010-08-02 7 views
0

J'ai une table qui permet d'insérer des enregistrements qui sont très similaires mais diffèrent par une seule valeur de colonne ou deux. Par exemple, les documents suivants sont dans le tableau:mettre à jour les enregistrements en double ou similaires dans la même table

ID TITLE         URL        COUNTRY 

1494 Hollywood Reporter     http://www.hollywoodreporter.com USA 
1497 Hollywood Reporter via Drudge Report http://www.hollywoodreporter.com NULL 
2158 Hollywood Reporter via    http://www.hollywoodreporter.com NULL 

Je voudrais mettre à jour la colonne de pays au cours des deux derniers enregistrements où l'URL est la même. Aussi je voudrais aussi savoir comment trier ma table par colonne url afin que tous les urls en double sont regroupés ou même si elles sont similaires que vous avez dans certains cas comme:

http://www.hollywoodreporter.com  http://www.blog.hollywoodreporter.com 

Merci à l'avance.

Essayé ce qui suit et cela a fonctionné, où les urls étaient les mêmes

UPDATE t1 

SET t1.country = t2.country à partir de sources AS t1 sources t2 Inscrivez- SUR t1.url = t2.url O WH t1.url = t2.url;

juste à comprendre le reste. merci à tous


MISE À JOUR

j'ai pu modifier les enregistrements qui avaient urls correspondant, mais pour ceux qui sont similaires comme http://www.pantagraph.com http://pantagraph.com http://pantagraph.com/titles

n'ont pas été mis à jour. Lorsque vous utilisez le tri et sélectionnez Je peux afficher tous ces enregistrements, mais en essayant de les mettre à jour, cela ne fonctionne pas. J'ai même juste essayé cette version simple de:

select * from Sources s 
where s.url like url 

qui montre les enregistrements mais en mettant à jour il n'a pas fonctionné.

update Sources 
set country = s.country 
from Sources s 
where s.url like url 
+0

Pour répondre à votre deuxième question, vous devez définir "similaire". Pour vous aider avec votre premier problème à l'avenir, normaliser votre base de données afin que vous n'ayez pas ce problème à l'avenir. Les règles de normalisation ne sont pas seulement un exercice académique - elles existent pour résoudre les problèmes du monde réel. –

+0

sens similaire ils partagent la même racine URL ou domaine ... comme http://stackoverflow.com et http://stackoverflow.com/questions/ Merci pour le conseil ... la normalisation ... les bases ..let moi essayer la sous-requête – vbNewbie

Répondre

2

Vous pouvez utiliser une sous-requête:

update yt 
set  country = (
        select distinct country 
        from YourTable yt2 
        where yt.url = yt2.url 
          and yt2.country is not null 
       ) 
from YourTable yt 

Cela devrait donner une erreur s'il y a une URL avec différents pays: dans ce cas, vous devez adapter la requête de choisir l'un des pays.

par votre commentaire, pour trouver des lignes avec les pays en conflit:

select url 
,  count(distinct country) as NumberOfCountries 
from YourTable 
where country is not null 
group by 
     url 
,  country 
having count(distinct country) > 1 
+0

ouais j'ai eu l'erreur suivante; La sous-requête a renvoyé plus de 1 valeur. Cela est interdit lorsque la sous-requête suit =,! =, Lorsque je fais ce qui suit: select * from Sources s où url = s.url Je vois les enregistrements que je veux mettre à jour mais je n'arrive pas à comprendre comment. – vbNewbie

+0

@vbNewbie: Ajout d'une requête de recherche de conflit à la réponse, espérons que cela aide – Andomar

1

Pour trier l'URL, essayez d'ajouter une autre colonne pour seulement « nom de domaine ». Vous devez extraire le nom de domaine (hollywoodreporter.com), le stocker et trier sur cette colonne. Vous pouvez également utiliser des expressions régulières dans votre clause ORDER BY, mais cela peut entraîner des problèmes de performances.

1
update table 
set 
    table.country = t2.country 
from 
    table t2 
where 
    table.url = t2.url 
    and t2.country is not null 

vous rejoignez la table se base sur l'URL et la mise à jour de lignes qui ont quelque chose dans le domaine du pays. Mais, si vous avez autant de données en double, votre conception est probablement mauvaise. Essayez de normaliser la DB si vous le pouvez.

+0

S'il y avait plusieurs pays par URL, cela écraserait le pays plusieurs fois (pas nécessairement mauvais) – Andomar

+0

Merci pour la réponse. On me l'a dit aussi ci-dessus, mais avec cette table en particulier ayant plus de 2 millions d'enregistrements, j'ai peur de compromettre les données. J'ai supprimé les doublons et certaines colonnes contiennent la même valeur mais les enregistrements eux-mêmes sont uniques. – vbNewbie

Questions connexes