OVH Cloud OVH Cloud

Comparaison de tables

16 réponses
Avatar
Alain TEYSSEDRE
Bonjour

J'ai 2 tables Table1 et Table2
qui ont comme champs Champs1, Champs2, Champs3 ...pour Table1
et ChampA, , ChampB, ChampC .. pour Table2

Je souhaite par code VBA supprimer de Table1 tous les enregistrements pour
lesquels
la valeur de Champ1 ne correspond à aucune valeur de ChampC dans table 2.

c'est surement évident mais ce soir j'y arrive pas !

merci pour votre aide

Alain

10 réponses

1 2
Avatar
Michel Walsh
Salut,


Peut-être quelque chose dans le genre:


DELETE DISTINCTROW table1.*
FROM table1 LEFT JOIN table2
ON table1.champ1 = table2.champA
AND
table1.champ2 = table2.champB
AND
... jusqu'à plus soif ...

WHERE table2.ChampDeLaCléPrimaire Is Null



Espérant être utile,
Vanderghast, Access MVP


"Alain TEYSSEDRE" wrote in message
news:
Bonjour

J'ai 2 tables Table1 et Table2
qui ont comme champs Champs1, Champs2, Champs3 ...pour Table1
et ChampA, , ChampB, ChampC .. pour Table2

Je souhaite par code VBA supprimer de Table1 tous les enregistrements pour
lesquels
la valeur de Champ1 ne correspond à aucune valeur de ChampC dans table 2.

c'est surement évident mais ce soir j'y arrive pas !

merci pour votre aide

Alain




Avatar
Alain TEYSSEDRE
Bonjour Michel

Malheureusement ta suggestion ne me permet pas d'obtenir ce que je souhaite.

En fait je sais sélectionner les enregistrements de Table1 qui
m'interressent avec la requete:
SELECT Table1.*
FROM Table2, Table1
WHERE (([Table1].[Champ4]<>[Table2].[ChampB]));

Comme tu le comprends je ne compare les valeurs que de 2 champs, (le nombre
de champs de chaque Table est différent).

Ce que je n'arrive pas à faire c'est sélectionner (pour les DELETER) tous
les champs de
Table1 qui n'ont pas été sélectionnés dans ma requete ...

ps: pour etre complet j'ai actuellement ChampB de table2 qui est de type
Lien hypertexte
si vraiment cela était un obstacle incontournable je le changerai en
champ texte
@+
Alain



"Michel Walsh" a écrit dans le message
de news:
Salut,


Peut-être quelque chose dans le genre:


DELETE DISTINCTROW table1.*
FROM table1 LEFT JOIN table2
ON table1.champ1 = table2.champA
AND
table1.champ2 = table2.champB
AND
... jusqu'à plus soif ...

WHERE table2.ChampDeLaCléPrimaire Is Null



Espérant être utile,
Vanderghast, Access MVP


"Alain TEYSSEDRE" wrote in message
news:
Bonjour

J'ai 2 tables Table1 et Table2
qui ont comme champs Champs1, Champs2, Champs3 ...pour Table1
et ChampA, , ChampB, ChampC .. pour Table2

Je souhaite par code VBA supprimer de Table1 tous les enregistrements
pour


lesquels
la valeur de Champ1 ne correspond à aucune valeur de ChampC dans table
2.



c'est surement évident mais ce soir j'y arrive pas !

merci pour votre aide

Alain








Avatar
Michel Walsh
Salut,


Si il s'agit d'avoir les enregistrements de Table1 qui ne sont pas retournés
par

SELECT Table1.*
FROM Table2, Table1
WHERE (([Table1].[Champ4]<>[Table2].[ChampB]));


alors:

SELECT Table1.*
FROM Table2 RIGHT JOIN Table1
ON Table1.champ4 <> table2.champB
WHERE Table2.ChampB Is Null


devrait le faire.


J'ai simplement commencé par remonter la comparaison entre tables de la
clause WHERE au join, dans la clause ON:

SELECT Table1.*
FROM Table2 INNER JOIN Table1
ON Table1.champ4 <> table2.champB

Plus de clause WHERE, mais tout à fait équivalent au premier énoncé (par
contre, on perd la grille de design). La seule différence qui existe entre
un join externe et ce join interne c'est justement de conserver les
enregistrements qui n'apparaissent pas lors du join interne ! Ce sont CES
enregistrements qu'on veut pointer du doigt, et leur "signature" c'est
qu'ils ont des NULL dans les colonnes de la table "non préservée"... Table2
dans notre cas. D'où la solution proposée.


Pour effacer, changer le SELECT par DELETE DISTINCTROW



Espérant être utile,
Vanderghast, Access MVP


"Alain TEYSSEDRE" wrote in message
news:%
Bonjour Michel

Malheureusement ta suggestion ne me permet pas d'obtenir ce que je
souhaite.


En fait je sais sélectionner les enregistrements de Table1 qui
m'interressent avec la requete:
SELECT Table1.*
FROM Table2, Table1
WHERE (([Table1].[Champ4]<>[Table2].[ChampB]));

Comme tu le comprends je ne compare les valeurs que de 2 champs, (le
nombre

de champs de chaque Table est différent).

Ce que je n'arrive pas à faire c'est sélectionner (pour les DELETER) tous
les champs de
Table1 qui n'ont pas été sélectionnés dans ma requete ...

ps: pour etre complet j'ai actuellement ChampB de table2 qui est de type
Lien hypertexte
si vraiment cela était un obstacle incontournable je le changerai en
champ texte
@+
Alain



"Michel Walsh" a écrit dans le
message

de news:
Salut,


Peut-être quelque chose dans le genre:


DELETE DISTINCTROW table1.*
FROM table1 LEFT JOIN table2
ON table1.champ1 = table2.champA
AND
table1.champ2 = table2.champB
AND
... jusqu'à plus soif ...

WHERE table2.ChampDeLaCléPrimaire Is Null



Espérant être utile,
Vanderghast, Access MVP


"Alain TEYSSEDRE" wrote in
message


news:
Bonjour

J'ai 2 tables Table1 et Table2
qui ont comme champs Champs1, Champs2, Champs3 ...pour Table1
et ChampA, , ChampB, ChampC .. pour Table2

Je souhaite par code VBA supprimer de Table1 tous les enregistrements
pour


lesquels
la valeur de Champ1 ne correspond à aucune valeur de ChampC dans table
2.



c'est surement évident mais ce soir j'y arrive pas !

merci pour votre aide

Alain












Avatar
Alain TEYSSEDRE
Re-Bonjour

Bon ta requete Selection ==> super ça marche le résultat est OK

par contre moi aussi je croyais qu'il suffisait de remplacer SELECT par
DELETE DISTINCTROW .. et la patatras Erreur ..."Impossible de supprimer
dans les tables spécifiées !"

aurais tu une idée

Merci
Alain






"Michel Walsh" a écrit dans le message
de news:
Salut,


Si il s'agit d'avoir les enregistrements de Table1 qui ne sont pas
retournés

par

SELECT Table1.*
FROM Table2, Table1
WHERE (([Table1].[Champ4]<>[Table2].[ChampB]));


alors:

SELECT Table1.*
FROM Table2 RIGHT JOIN Table1
ON Table1.champ4 <> table2.champB
WHERE Table2.ChampB Is Null


devrait le faire.


J'ai simplement commencé par remonter la comparaison entre tables de la
clause WHERE au join, dans la clause ON:

SELECT Table1.*
FROM Table2 INNER JOIN Table1
ON Table1.champ4 <> table2.champB

Plus de clause WHERE, mais tout à fait équivalent au premier énoncé (par
contre, on perd la grille de design). La seule différence qui existe entre
un join externe et ce join interne c'est justement de conserver les
enregistrements qui n'apparaissent pas lors du join interne ! Ce sont CES
enregistrements qu'on veut pointer du doigt, et leur "signature" c'est
qu'ils ont des NULL dans les colonnes de la table "non préservée"...
Table2

dans notre cas. D'où la solution proposée.


Pour effacer, changer le SELECT par DELETE DISTINCTROW



Espérant être utile,
Vanderghast, Access MVP


"Alain TEYSSEDRE" wrote in message
news:%
Bonjour Michel

Malheureusement ta suggestion ne me permet pas d'obtenir ce que je
souhaite.


En fait je sais sélectionner les enregistrements de Table1 qui
m'interressent avec la requete:
SELECT Table1.*
FROM Table2, Table1
WHERE (([Table1].[Champ4]<>[Table2].[ChampB]));

Comme tu le comprends je ne compare les valeurs que de 2 champs, (le
nombre

de champs de chaque Table est différent).

Ce que je n'arrive pas à faire c'est sélectionner (pour les DELETER)
tous


les champs de
Table1 qui n'ont pas été sélectionnés dans ma requete ...

ps: pour etre complet j'ai actuellement ChampB de table2 qui est de type
Lien hypertexte
si vraiment cela était un obstacle incontournable je le changerai
en


champ texte
@+
Alain



"Michel Walsh" a écrit dans le
message

de news:
Salut,


Peut-être quelque chose dans le genre:


DELETE DISTINCTROW table1.*
FROM table1 LEFT JOIN table2
ON table1.champ1 = table2.champA
AND
table1.champ2 = table2.champB
AND
... jusqu'à plus soif ...

WHERE table2.ChampDeLaCléPrimaire Is Null



Espérant être utile,
Vanderghast, Access MVP


"Alain TEYSSEDRE" wrote in
message


news:
Bonjour

J'ai 2 tables Table1 et Table2
qui ont comme champs Champs1, Champs2, Champs3 ...pour Table1
et ChampA, , ChampB, ChampC .. pour Table2

Je souhaite par code VBA supprimer de Table1 tous les
enregistrements




pour
lesquels
la valeur de Champ1 ne correspond à aucune valeur de ChampC dans
table




2.

c'est surement évident mais ce soir j'y arrive pas !

merci pour votre aide

Alain
















Avatar
Michel Walsh
Intéressant...


Cette solution de rechange devrait faire l'affaire...


SELECT Table1.*
FROM Table1
WHERE Champ4 <> ALL( SELECT ChampB FROM table2)

ou, évidemment

DELETE Table1.*
FROM Table1
WHERE Champ4 <> ALL( SELECT ChampB FROM table2)




Vanderghast, Access MVP



"Alain TEYSSEDRE" wrote in message
news:
Re-Bonjour

Bon ta requete Selection ==> super ça marche le résultat est OK

par contre moi aussi je croyais qu'il suffisait de remplacer SELECT par
DELETE DISTINCTROW .. et la patatras Erreur ..."Impossible de supprimer
dans les tables spécifiées !"

aurais tu une idée

Merci
Alain






"Michel Walsh" a écrit dans le
message

de news:
Salut,


Si il s'agit d'avoir les enregistrements de Table1 qui ne sont pas
retournés

par

SELECT Table1.*
FROM Table2, Table1
WHERE (([Table1].[Champ4]<>[Table2].[ChampB]));


alors:

SELECT Table1.*
FROM Table2 RIGHT JOIN Table1
ON Table1.champ4 <> table2.champB
WHERE Table2.ChampB Is Null


devrait le faire.


J'ai simplement commencé par remonter la comparaison entre tables de la
clause WHERE au join, dans la clause ON:

SELECT Table1.*
FROM Table2 INNER JOIN Table1
ON Table1.champ4 <> table2.champB

Plus de clause WHERE, mais tout à fait équivalent au premier énoncé (par
contre, on perd la grille de design). La seule différence qui existe
entre


un join externe et ce join interne c'est justement de conserver les
enregistrements qui n'apparaissent pas lors du join interne ! Ce sont
CES


enregistrements qu'on veut pointer du doigt, et leur "signature" c'est
qu'ils ont des NULL dans les colonnes de la table "non préservée"...
Table2

dans notre cas. D'où la solution proposée.


Pour effacer, changer le SELECT par DELETE DISTINCTROW



Espérant être utile,
Vanderghast, Access MVP


"Alain TEYSSEDRE" wrote in
message


news:%
Bonjour Michel

Malheureusement ta suggestion ne me permet pas d'obtenir ce que je
souhaite.


En fait je sais sélectionner les enregistrements de Table1 qui
m'interressent avec la requete:
SELECT Table1.*
FROM Table2, Table1
WHERE (([Table1].[Champ4]<>[Table2].[ChampB]));

Comme tu le comprends je ne compare les valeurs que de 2 champs, (le
nombre

de champs de chaque Table est différent).

Ce que je n'arrive pas à faire c'est sélectionner (pour les DELETER)
tous


les champs de
Table1 qui n'ont pas été sélectionnés dans ma requete ...

ps: pour etre complet j'ai actuellement ChampB de table2 qui est de
type



Lien hypertexte
si vraiment cela était un obstacle incontournable je le changerai
en


champ texte
@+
Alain



"Michel Walsh" a écrit dans le
message

de news:
Salut,


Peut-être quelque chose dans le genre:


DELETE DISTINCTROW table1.*
FROM table1 LEFT JOIN table2
ON table1.champ1 = table2.champA
AND
table1.champ2 = table2.champB
AND
... jusqu'à plus soif ...

WHERE table2.ChampDeLaCléPrimaire Is Null



Espérant être utile,
Vanderghast, Access MVP


"Alain TEYSSEDRE" wrote in
message


news:
Bonjour

J'ai 2 tables Table1 et Table2
qui ont comme champs Champs1, Champs2, Champs3 ...pour Table1
et ChampA, , ChampB, ChampC .. pour Table2

Je souhaite par code VBA supprimer de Table1 tous les
enregistrements




pour
lesquels
la valeur de Champ1 ne correspond à aucune valeur de ChampC dans
table




2.

c'est surement évident mais ce soir j'y arrive pas !

merci pour votre aide

Alain




















Avatar
Michel Walsh
Salut,


Ne PAS utiliser <> ALL tel que je proposais, du moins... pas avoir de
lire ce qui suit...il semble que ce n'est logiquement pas équivalent à ce
qu'on peut chercher...


En fait, si les enregistrement de table1 sous Champ1 ont les valeurs { 1,
2, 3 }

et table2.ChampB les valeurs { 1, 2, 4 }

alors,
SELECT Champ1, ChampB
FROM Table1, Table2
WHERE table1.Champ1 <>table2.ChampB

donne
1 2
1 4
2 1
2 4
3 1
3 2
3 4


toutes les lignes de champ1 apparaissent dans champB. Seules les
combinaisons (1 , 1) et ( 2, 2 ) ne furent pas retenues. Il faut effacer
1 et 2 de table1 ? Si c'est bien cela, alors un simple IN est à utiliser


SELECT Champ1
FROM table1
WHERE Camp1 = ANY( SELECT ChampB FROM table2)


( = ANY peut être remplacé par IN )



Le <> ALL, sa négation, NOT IN si on préfère, effacera l'enregistrement
ayant 3 comme valeur de Champ1.



Donc, pour simplifier, vérifier si on désire


SELECT Champ1
FROM table1
WHERE Camp1 IN( SELECT ChampB FROM table2)


ou si on désire

SELECT Champ1
FROM table1
WHERE NOT Camp1 IN( SELECT ChampB FROM table2)



tout simplement... et utiliser un DELETE par la suite (qui devrait
fonctionner).


Vanderghast, Access MVP


"Alain TEYSSEDRE" wrote in message
news:
Re-Bonjour

Bon ta requete Selection ==> super ça marche le résultat est OK

par contre moi aussi je croyais qu'il suffisait de remplacer SELECT par
DELETE DISTINCTROW .. et la patatras Erreur ..."Impossible de supprimer
dans les tables spécifiées !"

aurais tu une idée

Merci
Alain






"Michel Walsh" a écrit dans le
message

de news:
Salut,


Si il s'agit d'avoir les enregistrements de Table1 qui ne sont pas
retournés

par

SELECT Table1.*
FROM Table2, Table1
WHERE (([Table1].[Champ4]<>[Table2].[ChampB]));


alors:

SELECT Table1.*
FROM Table2 RIGHT JOIN Table1
ON Table1.champ4 <> table2.champB
WHERE Table2.ChampB Is Null


devrait le faire.


J'ai simplement commencé par remonter la comparaison entre tables de la
clause WHERE au join, dans la clause ON:

SELECT Table1.*
FROM Table2 INNER JOIN Table1
ON Table1.champ4 <> table2.champB

Plus de clause WHERE, mais tout à fait équivalent au premier énoncé (par
contre, on perd la grille de design). La seule différence qui existe
entre


un join externe et ce join interne c'est justement de conserver les
enregistrements qui n'apparaissent pas lors du join interne ! Ce sont
CES


enregistrements qu'on veut pointer du doigt, et leur "signature" c'est
qu'ils ont des NULL dans les colonnes de la table "non préservée"...
Table2

dans notre cas. D'où la solution proposée.


Pour effacer, changer le SELECT par DELETE DISTINCTROW



Espérant être utile,
Vanderghast, Access MVP


"Alain TEYSSEDRE" wrote in
message


news:%
Bonjour Michel

Malheureusement ta suggestion ne me permet pas d'obtenir ce que je
souhaite.


En fait je sais sélectionner les enregistrements de Table1 qui
m'interressent avec la requete:
SELECT Table1.*
FROM Table2, Table1
WHERE (([Table1].[Champ4]<>[Table2].[ChampB]));

Comme tu le comprends je ne compare les valeurs que de 2 champs, (le
nombre

de champs de chaque Table est différent).

Ce que je n'arrive pas à faire c'est sélectionner (pour les DELETER)
tous


les champs de
Table1 qui n'ont pas été sélectionnés dans ma requete ...

ps: pour etre complet j'ai actuellement ChampB de table2 qui est de
type



Lien hypertexte
si vraiment cela était un obstacle incontournable je le changerai
en


champ texte
@+
Alain



"Michel Walsh" a écrit dans le
message

de news:
Salut,


Peut-être quelque chose dans le genre:


DELETE DISTINCTROW table1.*
FROM table1 LEFT JOIN table2
ON table1.champ1 = table2.champA
AND
table1.champ2 = table2.champB
AND
... jusqu'à plus soif ...

WHERE table2.ChampDeLaCléPrimaire Is Null



Espérant être utile,
Vanderghast, Access MVP


"Alain TEYSSEDRE" wrote in
message


news:
Bonjour

J'ai 2 tables Table1 et Table2
qui ont comme champs Champs1, Champs2, Champs3 ...pour Table1
et ChampA, , ChampB, ChampC .. pour Table2

Je souhaite par code VBA supprimer de Table1 tous les
enregistrements




pour
lesquels
la valeur de Champ1 ne correspond à aucune valeur de ChampC dans
table




2.

c'est surement évident mais ce soir j'y arrive pas !

merci pour votre aide

Alain




















Avatar
Alain TEYSSEDRE
Désolé mais cela ne me retourne aucun enregistrement !

Dommage c'était plutot Sioux .

Alain


"Michel Walsh" a écrit dans le message
de news:%
Intéressant...


Cette solution de rechange devrait faire l'affaire...


SELECT Table1.*
FROM Table1
WHERE Champ4 <> ALL( SELECT ChampB FROM table2)

ou, évidemment

DELETE Table1.*
FROM Table1
WHERE Champ4 <> ALL( SELECT ChampB FROM table2)




Vanderghast, Access MVP



"Alain TEYSSEDRE" wrote in message
news:
Re-Bonjour

Bon ta requete Selection ==> super ça marche le résultat est OK

par contre moi aussi je croyais qu'il suffisait de remplacer SELECT par
DELETE DISTINCTROW .. et la patatras Erreur ..."Impossible de supprimer
dans les tables spécifiées !"

aurais tu une idée

Merci
Alain






"Michel Walsh" a écrit dans le
message

de news:
Salut,


Si il s'agit d'avoir les enregistrements de Table1 qui ne sont pas
retournés

par

SELECT Table1.*
FROM Table2, Table1
WHERE (([Table1].[Champ4]<>[Table2].[ChampB]));


alors:

SELECT Table1.*
FROM Table2 RIGHT JOIN Table1
ON Table1.champ4 <> table2.champB
WHERE Table2.ChampB Is Null


devrait le faire.


J'ai simplement commencé par remonter la comparaison entre tables de
la



clause WHERE au join, dans la clause ON:

SELECT Table1.*
FROM Table2 INNER JOIN Table1
ON Table1.champ4 <> table2.champB

Plus de clause WHERE, mais tout à fait équivalent au premier énoncé
(par



contre, on perd la grille de design). La seule différence qui existe
entre


un join externe et ce join interne c'est justement de conserver les
enregistrements qui n'apparaissent pas lors du join interne ! Ce sont
CES


enregistrements qu'on veut pointer du doigt, et leur "signature" c'est
qu'ils ont des NULL dans les colonnes de la table "non préservée"...
Table2

dans notre cas. D'où la solution proposée.


Pour effacer, changer le SELECT par DELETE DISTINCTROW



Espérant être utile,
Vanderghast, Access MVP


"Alain TEYSSEDRE" wrote in
message


news:%
Bonjour Michel

Malheureusement ta suggestion ne me permet pas d'obtenir ce que je
souhaite.


En fait je sais sélectionner les enregistrements de Table1 qui
m'interressent avec la requete:
SELECT Table1.*
FROM Table2, Table1
WHERE (([Table1].[Champ4]<>[Table2].[ChampB]));

Comme tu le comprends je ne compare les valeurs que de 2 champs, (le
nombre

de champs de chaque Table est différent).

Ce que je n'arrive pas à faire c'est sélectionner (pour les DELETER)
tous


les champs de
Table1 qui n'ont pas été sélectionnés dans ma requete ...

ps: pour etre complet j'ai actuellement ChampB de table2 qui est de
type



Lien hypertexte
si vraiment cela était un obstacle incontournable je le
changerai




en
champ texte
@+
Alain



"Michel Walsh" a écrit dans le
message

de news:
Salut,


Peut-être quelque chose dans le genre:


DELETE DISTINCTROW table1.*
FROM table1 LEFT JOIN table2
ON table1.champ1 = table2.champA
AND
table1.champ2 = table2.champB
AND
... jusqu'à plus soif ...

WHERE table2.ChampDeLaCléPrimaire Is Null



Espérant être utile,
Vanderghast, Access MVP


"Alain TEYSSEDRE" wrote in
message


news:
Bonjour

J'ai 2 tables Table1 et Table2
qui ont comme champs Champs1, Champs2, Champs3 ...pour Table1
et ChampA, , ChampB, ChampC .. pour Table2

Je souhaite par code VBA supprimer de Table1 tous les
enregistrements




pour
lesquels
la valeur de Champ1 ne correspond à aucune valeur de ChampC dans
table




2.

c'est surement évident mais ce soir j'y arrive pas !

merci pour votre aide

Alain
























Avatar
Alain TEYSSEDRE
helas Trois fois Helas la requete est toujour vide ...

Si les valeurs de Champ1 de Table 1 sont
:Toto,Tata,Tutu,Titi,Toto,Tutu,Tata,Tutu, Tittii => total de 9
enregistrements
et les valeurs de ChampB de Table 2 sont : Zaza,Zozo,Toto,Zazi,Tutu => total
de 5 enregistrements

alors la requete doit permettre de DELETER ou (retourner) tous les
enregistrements
de tous les champs de Table1 dont on retrouve une valeur dans Table2 (il
s'agit des 5 enregistrements Toto,Tutu,Toto,Tutu, Tutu)

@+

Alain



En fait, si les enregistrement de table1 sous Champ1 ont les valeurs { 1,
2, 3 }

et table2.ChampB les valeurs { 1, 2, 4 }

alors,
SELECT Champ1, ChampB
FROM Table1, Table2
WHERE table1.Champ1 <>table2.ChampB

donne
1 2
1 4
2 1
2 4
3 1
3 2
3 4


toutes les lignes de champ1 apparaissent dans champB. Seules les
combinaisons (1 , 1) et ( 2, 2 ) ne furent pas retenues. Il faut
effacer

1 et 2 de table1 ? Si c'est bien cela, alors un simple IN est à
utiliser



SELECT Champ1
FROM table1
WHERE Camp1 = ANY( SELECT ChampB FROM table2)


( = ANY peut être remplacé par IN )



Le <> ALL, sa négation, NOT IN si on préfère, effacera l'enregistrement
ayant 3 comme valeur de Champ1.



Donc, pour simplifier, vérifier si on désire


SELECT Champ1
FROM table1
WHERE Camp1 IN( SELECT ChampB FROM table2)


ou si on désire

SELECT Champ1
FROM table1
WHERE NOT Camp1 IN( SELECT ChampB FROM table2)



tout simplement... et utiliser un DELETE par la suite (qui devrait
fonctionner).


Vanderghast, Access MVP


"Alain TEYSSEDRE" wrote in message
news:
Re-Bonjour

Bon ta requete Selection ==> super ça marche le résultat est OK

par contre moi aussi je croyais qu'il suffisait de remplacer SELECT par
DELETE DISTINCTROW .. et la patatras Erreur ..."Impossible de supprimer
dans les tables spécifiées !"

aurais tu une idée

Merci
Alain






"Michel Walsh" a écrit dans le
message

de news:
Salut,


Si il s'agit d'avoir les enregistrements de Table1 qui ne sont pas
retournés

par

SELECT Table1.*
FROM Table2, Table1
WHERE (([Table1].[Champ4]<>[Table2].[ChampB]));


alors:

SELECT Table1.*
FROM Table2 RIGHT JOIN Table1
ON Table1.champ4 <> table2.champB
WHERE Table2.ChampB Is Null


devrait le faire.


J'ai simplement commencé par remonter la comparaison entre tables de
la



clause WHERE au join, dans la clause ON:

SELECT Table1.*
FROM Table2 INNER JOIN Table1
ON Table1.champ4 <> table2.champB

Plus de clause WHERE, mais tout à fait équivalent au premier énoncé
(par



contre, on perd la grille de design). La seule différence qui existe
entre


un join externe et ce join interne c'est justement de conserver les
enregistrements qui n'apparaissent pas lors du join interne ! Ce sont
CES


enregistrements qu'on veut pointer du doigt, et leur "signature" c'est
qu'ils ont des NULL dans les colonnes de la table "non préservée"...
Table2

dans notre cas. D'où la solution proposée.


Pour effacer, changer le SELECT par DELETE DISTINCTROW



Espérant être utile,
Vanderghast, Access MVP


"Alain TEYSSEDRE" wrote in
message


news:%
Bonjour Michel

Malheureusement ta suggestion ne me permet pas d'obtenir ce que je
souhaite.


En fait je sais sélectionner les enregistrements de Table1 qui
m'interressent avec la requete:
SELECT Table1.*
FROM Table2, Table1
WHERE (([Table1].[Champ4]<>[Table2].[ChampB]));

Comme tu le comprends je ne compare les valeurs que de 2 champs, (le
nombre

de champs de chaque Table est différent).

Ce que je n'arrive pas à faire c'est sélectionner (pour les DELETER)
tous


les champs de
Table1 qui n'ont pas été sélectionnés dans ma requete ...

ps: pour etre complet j'ai actuellement ChampB de table2 qui est de
type



Lien hypertexte
si vraiment cela était un obstacle incontournable je le
changerai




en
champ texte
@+
Alain



"Michel Walsh" a écrit dans le
message

de news:
Salut,


Peut-être quelque chose dans le genre:


DELETE DISTINCTROW table1.*
FROM table1 LEFT JOIN table2
ON table1.champ1 = table2.champA
AND
table1.champ2 = table2.champB
AND
... jusqu'à plus soif ...

WHERE table2.ChampDeLaCléPrimaire Is Null



Espérant être utile,
Vanderghast, Access MVP


"Alain TEYSSEDRE" wrote in
message


news:
Bonjour

J'ai 2 tables Table1 et Table2
qui ont comme champs Champs1, Champs2, Champs3 ...pour Table1
et ChampA, , ChampB, ChampC .. pour Table2

Je souhaite par code VBA supprimer de Table1 tous les
enregistrements




pour
lesquels
la valeur de Champ1 ne correspond à aucune valeur de ChampC dans
table




2.

c'est surement évident mais ce soir j'y arrive pas !

merci pour votre aide

Alain
























Avatar
Alain TEYSSEDRE
Ce mail annule et remplace mon précédant mail inclus ci-dessous

Si les valeurs de Champ1 de Table 1 sont
Toto,Tata,Tutu,Titi,Toto,Tutu,Tata,Tutu, Tittii => total de 9
enregistrements
et les valeurs de ChampB de Table 2 sont : Zaza,Zozo,Toto,Zazi,Tutu => total
de 5 enregistrements
alors la requete doit permettre de DELETER ou (retourner) tous les
enregistrements
(de tous les champs) de Table1 dont on NE retrouve AUCUNE valeur dans Table2

Après l'opération DELETE ma Table1 doit contenir 5 enregistrements avec
comme valeurs pour
Champs1 : Toto, Tutu, Toto, Tutu, Tutu .

ouf ça y est

cdlt
Alain




A force de reflechir je me mélange les pinceaux :
"Alain TEYSSEDRE" a écrit dans le
message de news:evc%
helas Trois fois Helas la requete est toujour vide ...

Si les valeurs de Champ1 de Table 1 sont
:Toto,Tata,Tutu,Titi,Toto,Tutu,Tata,Tutu, Tittii => total de 9
enregistrements
et les valeurs de ChampB de Table 2 sont : Zaza,Zozo,Toto,Zazi,Tutu =>
total

de 5 enregistrements

alors la requete doit permettre de DELETER ou (retourner) tous les
enregistrements
de tous les champs de Table1 dont on retrouve une valeur dans Table2 (il
s'agit des 5 enregistrements Toto,Tutu,Toto,Tutu, Tutu)

@+

Alain



Avatar
Michel Walsh
Salut,


donc un simple IN ( ou =ANY ) devrait faire l'affaire:


DELETE *
FROM table1
WHERE champ1 IN ( SELECT champB FROM table2)


non?


Vanderghast, Access MVP




"Alain TEYSSEDRE" wrote in message
news:evc%
helas Trois fois Helas la requete est toujour vide ...

Si les valeurs de Champ1 de Table 1 sont
:Toto,Tata,Tutu,Titi,Toto,Tutu,Tata,Tutu, Tittii => total de 9
enregistrements
et les valeurs de ChampB de Table 2 sont : Zaza,Zozo,Toto,Zazi,Tutu =>
total

de 5 enregistrements

alors la requete doit permettre de DELETER ou (retourner) tous les
enregistrements
de tous les champs de Table1 dont on retrouve une valeur dans Table2 (il
s'agit des 5 enregistrements Toto,Tutu,Toto,Tutu, Tutu)

@+

Alain



En fait, si les enregistrement de table1 sous Champ1 ont les valeurs
{ 1,


2, 3 }

et table2.ChampB les valeurs { 1, 2, 4 }

alors,
SELECT Champ1, ChampB
FROM Table1, Table2
WHERE table1.Champ1 <>table2.ChampB

donne
1 2
1 4
2 1
2 4
3 1
3 2
3 4


toutes les lignes de champ1 apparaissent dans champB. Seules les
combinaisons (1 , 1) et ( 2, 2 ) ne furent pas retenues. Il faut
effacer

1 et 2 de table1 ? Si c'est bien cela, alors un simple IN est à
utiliser



SELECT Champ1
FROM table1
WHERE Camp1 = ANY( SELECT ChampB FROM table2)


( = ANY peut être remplacé par IN )



Le <> ALL, sa négation, NOT IN si on préfère, effacera l'enregistrement
ayant 3 comme valeur de Champ1.



Donc, pour simplifier, vérifier si on désire


SELECT Champ1
FROM table1
WHERE Camp1 IN( SELECT ChampB FROM table2)


ou si on désire

SELECT Champ1
FROM table1
WHERE NOT Camp1 IN( SELECT ChampB FROM table2)



tout simplement... et utiliser un DELETE par la suite (qui devrait
fonctionner).


Vanderghast, Access MVP


"Alain TEYSSEDRE" wrote in
message


news:
Re-Bonjour

Bon ta requete Selection ==> super ça marche le résultat est OK

par contre moi aussi je croyais qu'il suffisait de remplacer SELECT
par



DELETE DISTINCTROW .. et la patatras Erreur ..."Impossible de
supprimer



dans les tables spécifiées !"

aurais tu une idée

Merci
Alain






"Michel Walsh" a écrit dans le
message

de news:
Salut,


Si il s'agit d'avoir les enregistrements de Table1 qui ne sont pas
retournés

par

SELECT Table1.*
FROM Table2, Table1
WHERE (([Table1].[Champ4]<>[Table2].[ChampB]));


alors:

SELECT Table1.*
FROM Table2 RIGHT JOIN Table1
ON Table1.champ4 <> table2.champB
WHERE Table2.ChampB Is Null


devrait le faire.


J'ai simplement commencé par remonter la comparaison entre tables de
la



clause WHERE au join, dans la clause ON:

SELECT Table1.*
FROM Table2 INNER JOIN Table1
ON Table1.champ4 <> table2.champB

Plus de clause WHERE, mais tout à fait équivalent au premier énoncé
(par



contre, on perd la grille de design). La seule différence qui existe
entre


un join externe et ce join interne c'est justement de conserver les
enregistrements qui n'apparaissent pas lors du join interne ! Ce
sont




CES
enregistrements qu'on veut pointer du doigt, et leur "signature"
c'est




qu'ils ont des NULL dans les colonnes de la table "non préservée"...
Table2

dans notre cas. D'où la solution proposée.


Pour effacer, changer le SELECT par DELETE DISTINCTROW



Espérant être utile,
Vanderghast, Access MVP


"Alain TEYSSEDRE" wrote in
message


news:%
Bonjour Michel

Malheureusement ta suggestion ne me permet pas d'obtenir ce que je
souhaite.


En fait je sais sélectionner les enregistrements de Table1 qui
m'interressent avec la requete:
SELECT Table1.*
FROM Table2, Table1
WHERE (([Table1].[Champ4]<>[Table2].[ChampB]));

Comme tu le comprends je ne compare les valeurs que de 2 champs,
(le





nombre
de champs de chaque Table est différent).

Ce que je n'arrive pas à faire c'est sélectionner (pour les
DELETER)





tous
les champs de
Table1 qui n'ont pas été sélectionnés dans ma requete ...

ps: pour etre complet j'ai actuellement ChampB de table2 qui est
de





type
Lien hypertexte
si vraiment cela était un obstacle incontournable je le
changerai




en
champ texte
@+
Alain



"Michel Walsh" a écrit dans
le





message
de news:
Salut,


Peut-être quelque chose dans le genre:


DELETE DISTINCTROW table1.*
FROM table1 LEFT JOIN table2
ON table1.champ1 = table2.champA
AND
table1.champ2 = table2.champB
AND
... jusqu'à plus soif ...

WHERE table2.ChampDeLaCléPrimaire Is Null



Espérant être utile,
Vanderghast, Access MVP


"Alain TEYSSEDRE" wrote
in






message
news:
Bonjour

J'ai 2 tables Table1 et Table2
qui ont comme champs Champs1, Champs2, Champs3 ...pour Table1
et ChampA, , ChampB, ChampC .. pour Table2

Je souhaite par code VBA supprimer de Table1 tous les
enregistrements




pour
lesquels
la valeur de Champ1 ne correspond à aucune valeur de ChampC
dans







table
2.

c'est surement évident mais ce soir j'y arrive pas !

merci pour votre aide

Alain




























1 2