2017-03-20 2 views
0

En utilisant SQLite, disons que j'ai ces deux tables:Trouver un ensemble de colonnes distinct dans deux tables?

A 
_id num name group data1 data2 
1 4 ABC I    
2 4 CDE I    
3 5 CDE I      
4 5 CDE I      
5 5 CDE II    

B (doesn't have a _id column) 
    num name group data1 data2 
    4 ABC I  x  y  
    4 CDE I  x1  y1  
    5 CDE I  x2  y2  
    5 CDE I  x3  y3  
    5 CDE II  x4  y4  
    6 DEF III x5  y5  

Notez que je n'ai pas de clé primaire dans le tableau B. Je veux mettre à jour les valeurs du tableau A avec les valeurs de données du tableau B, mais seulement pour les lignes qui peuvent être identifiées de manière unique par les colonnes num, name et group dans les deux tables ou qui n'existent pas du tout dans le Tableau A. Ces colonnes sont essentiellement une sorte de clé combinée, et le seul moyen de connecter deux lignes dans la base de données .

Le résultat ressemblerait à quelque chose comme ceci:

A 
_id num name group data1 data2 
1 4 ABC I  x  y 
2 4 CDE I  x1  y1 
3 5 CDE I    
4 5 CDE I    
5 5 CDE II  x4  y4 
6 6 DEF III x5  y5 

J'ai essayé d'envelopper ma tête autour de cela pour quelques jours et essayé diverses solutions, mais aucun qui semble tout bon. Mes tables actuelles contiennent environ 3000 lignes chacune (le tableau B est une mise à jour du tableau A avec quelques centaines de changements mineurs). J'en suis venu à la conclusion qu'il faudra apporter des modifications manuelles aux lignes qui ne sont pas facilement identifiables, mais il serait bon de les minimiser autant que possible. La plupart des lignes semblent avoir des combinaisons uniques de num, name et group, c'est mon objectif pour le moment.

J'ai eu une idée de sélectionner tous distincts (en ce qui concerne num, name et group) les lignes du tableau A et toutes les lignes de la même distinctes du tableau B, et alors je devrais être en mesure de simplement itérer sur les lignes de B, trouver le correspondant (encore une fois en ce qui concerne les colonnes num, name et group) lignes du tableau A et copier les valeurs de B à A.

Mais je ne suis pas sûr que ce la façon de le faire, ou comment s'y prendre il ...

+0

Vous pouvez 'LEFT JOIN TableA' et trouver les combinaisons de' num', '' et name' group' n'obtiendra pas de _id dans la TableA et nécessitera une entrée manuelle. Je ne vois pas quel est le problème de mise à jour de ceux qui correspondent, vous faites juste 'inner join'? Peut-être que SQLite ne supporte pas 'UPDATE [..] FROM', donc vous avez juste besoin de faire une boucle dans un langage de programmation qui va exécuter ~ 3000 mises à jour. –

+0

@ ŁukaszKamiński Le problème est que je ne peux mettre à jour que ceux qui ont une combinaison distincte de 'num',' name' et 'group' dans les deux tables. Je ne suis pas sûr de savoir comment faire cela avec un «INNER JOIN»? N'ai-je pas besoin d'utiliser 'DISTINCT' quelque part? – BadCash

+0

Les deux tables peuvent avoir plus d'une ligne pour un ensemble donné de 'num, name, group'? –

Répondre

0

Cette requête retourne seulement unique B lignes

select num, name, group, min(data1) as data1, min(data2) as data2 
from B 
group by num, name, group 
having count(*)=1 

Utilisez-le pour mettre à jour le tableau A.

0

À première mise à jour des lignes uniques existantes:

with q(_id,data1,data2) as(
    select A._id,B.data1,B.data2 
    from A 
    join B 
     on B.num=A.num and B.name=A.name and B."group"=A."group" 
    group by A.num,A.name,A."group" 
    having count(1)=1 
) 
update A 
    set data1=(select data1 from Q where Q._id=A._id), 
     data2=(select data1 from Q where Q._id=A._id) 
where A._id in(select _id from Q); 

insérer ensuite nouvelles lignes:

insert into A(num,name,"group",data1,data2) 
select num,name,"group",data1,data2 
    from B 
    where not exists(select 1 
        from A 
        where B.num=A.num and B.name=A.name and B."group"=A."group" 
        ); 
+0

Merci, c'est un début :) L'une des nombreuses choses qui complique davantage le problème est que les colonnes de la combinaison de touches 'num',' name' et 'group' pourraient aussi avoir été changées dans le tableau B, donc simplement ajouter tout cela n'existe pas ne fonctionnera pas. Mais je pense que c'est là que le travail manuel devient nécessaire (bien qu'une solution que j'ai considéré était de vérifier si seulement 'num', 'name' ou' group' est distinct dans le cas où la combinaison ne peut pas être trouvée dans le tableau A comme la clé à la place, mais je pense que cela ne me sauverait pas le temps de mettre en œuvre ... – BadCash

+0

Et puis il y a bien sûr le problème que toutes les lignes n'ont pas une combinaison unique de 'num',' name' et 'group' ... soupir ... – BadCash