2009-08-11 5 views
1

Avertissement: Je viens de commencer avec des bases de données, donc il me manque probablement quelque chose d'extrêmement trivial.Synchronisation de N valeurs Accross Tables en SQL

J'ai deux tables (un peu liées, mais pas suffisantes pour être une seule table): table_one et table_two.


table_one comporte deux colonnes d'importance:

  1. name de type varchar(n)
  2. intersects de Type bit

table_two comporte une colonne de signification:

  1. name de Type varchar(n)

je voudrais automatiquement régléintersects soit 01 ou selon que name est présent dans table_two. Puis-je en quelque sorte déléguer cette responsabilité au moteur de base de données? J'utilise actuellement MySQL, si cela est important.


EDIT: Est-ce que ce genre de ATTELAGE même de sens lorsqu'ils traitent avec des bases de données?

Répondre

1

ANSI SQL:

update table_one 
set intersects = 
    case when 
     (select count(*) from table_two where name = table_one.name) > 0 
     then 1 
    else 0 end 

MySQL Rejoignez:

update table_one t1 
    left join table_two t2 on 
     t1.name = t2.name 
set t1.intersects = case when t2.name is not null then 1 else 0 end 

Vous pouvez mettre cette requête dans un trigger pour maintenir intersects mise à jour:

create trigger intersections after insert for each row 
begin 

    update table_one t1 
     left join table_two t2 on 
      t1.name = t2.name 
    set t1.intersects = case when t2.name is not null then 1 else 0 end 
    where t1.name = new.name 

end 

Maintenant, pour la discussion sur la conception:

Une colonne intersects est géniale et tout, mais vous pouvez rencontrer le problème de désynchronisation. Ce que vous pouvez faire est d'utiliser une fonction exists dans votre select lorsque vous appelez ceci:

select 
    * 
from 
    table_one t1 
where 
    exists (select 1 from table_two t2 where t2.name = t1.name) 

Vous pouvez utiliser not exists pour trouver ceux qui ne se croisent pas, aussi bien.

De plus, vous pouvez également utiliser un left join pour retirer les deux cas:

select 
    * 
from 
    table_one t1 
    left join table_two t2 on 
     t1.name = t2.name 

Tout est où t2.namenull, vous ne disposez pas d'une intersection. Tout ce qui ne l'est pas, vous le faites.Bien sûr, cela peut produire des lignes dupliquées si vous n'avez pas de contrainte unique sur name.

J'espère que cela éclairera tout cela!

+0

Merci Eric, est-ce que je devrais exécuter cette requête à chaque fois qu'il y a un changement à table_one? Existe-t-il un moyen d'enregistrer un rappel de sortes qui est appelé lorsqu'une modification de table se produit? –

+0

Par rappel, je ne veux pas dire dans mon application, je veux dire dans la base de données elle-même. –

+0

Fantastique! Merci encore! –

Questions connexes