OVH Cloud OVH Cloud

difference entre 2 tables

3 réponses
Avatar
Frédéric D
Bonjour

je sens que je vais poser une question de débutant posée 10000 fois, mais en
cherchant, je n'ai pas trouvé, et cela dépasse mes pauvres capacités en SQL
:
je souhaite selectionner les enregistrements d'une table qui n'ont aucune
correspondance dans une autre table.

Je sais remonter les lignes qui ont une correspondance exacte avec une
jointure interne :
select distinct b.long_name from editorial b inner join
marketprint1.dbo.objects a on (a.id_obj = b.record_id)
cela me renvoie 167 lignes
mais pour trouver ceux qui n'en ont aucune je suis tenté d'écrire :
select distinct b.long_name from editorial b inner join
marketprint1.dbo.objects a on NOT (a.id_obj = b.record_id) ou
select distinct b.long_name from editorial b inner join
marketprint1.dbo.objects a on (a.id_obj <> b.record_id)
cela me renvoie 432 lignes

donc au total 432+167 = 599 lignes

problème : dans ma table editorial, je n'ai que 432 lignes. donc si je
comprends bien, les 2 syntaxes que je propose ne me renvoie que les
enregistrements qui ont au moins une non-correspondance, mais pas ceux qui
n'en ont aucune.

Je ne vois pas comment faire. Quelqu'un saurait il m'aider ? Merci d'avance

3 réponses

Avatar
Frédéric D
heu je crois que j'ai la réponse, et en plus je crois que c'est une connerie
de ne mettre qu'un champ non clé dans la selection :
--> select distinct b.record_id, b.long_name from editorial b inner join
marketprint1.dbo.objects a on (a.id_obj = b.record_id)
me renvoie 207 lignes
--> select distinct b.record_id, b.long_name from editorial b where
b.record_id not in (select a.id_obj from marketprint1.dbo.objects a)
me renvoie 301 lignes
et enfin select count(*) from editorial b me renvoie 508 lignes

Est ce mieux comme ça ? Il me semble, mais je préfère vérifier avec des
spécialistes. Ma question est : Est ce que la syntaxe de ma 2e requète (avec
lle not in et la sous requète) me renvoie bien tous les tuples de la 1ere
table n'ayant aucune correspondance dans la 2e ?


"Frédéric D" a écrit dans le message de
news:
Bonjour

je sens que je vais poser une question de débutant posée 10000 fois, mais


en
cherchant, je n'ai pas trouvé, et cela dépasse mes pauvres capacités en


SQL
:
je souhaite selectionner les enregistrements d'une table qui n'ont aucune
correspondance dans une autre table.

Je sais remonter les lignes qui ont une correspondance exacte avec une
jointure interne :
select distinct b.long_name from editorial b inner join
marketprint1.dbo.objects a on (a.id_obj = b.record_id)
cela me renvoie 167 lignes
mais pour trouver ceux qui n'en ont aucune je suis tenté d'écrire :
select distinct b.long_name from editorial b inner join
marketprint1.dbo.objects a on NOT (a.id_obj = b.record_id) ou
select distinct b.long_name from editorial b inner join
marketprint1.dbo.objects a on (a.id_obj <> b.record_id)
cela me renvoie 432 lignes

donc au total 432+167 = 599 lignes

problème : dans ma table editorial, je n'ai que 432 lignes. donc si je
comprends bien, les 2 syntaxes que je propose ne me renvoie que les
enregistrements qui ont au moins une non-correspondance, mais pas ceux qui
n'en ont aucune.

Je ne vois pas comment faire. Quelqu'un saurait il m'aider ? Merci


d'avance




Avatar
bruno reiter [MVP]
select t1.c1
from t1 left join t2
on t1.c1 = t2.c1
where t2.c1 is null

br

"Frédéric D" wrote in message
news:
heu je crois que j'ai la réponse, et en plus je crois que c'est une connerie
de ne mettre qu'un champ non clé dans la selection :
--> select distinct b.record_id, b.long_name from editorial b inner join
marketprint1.dbo.objects a on (a.id_obj = b.record_id)
me renvoie 207 lignes
--> select distinct b.record_id, b.long_name from editorial b where
b.record_id not in (select a.id_obj from marketprint1.dbo.objects a)
me renvoie 301 lignes
et enfin select count(*) from editorial b me renvoie 508 lignes

Est ce mieux comme ça ? Il me semble, mais je préfère vérifier avec des
spécialistes. Ma question est : Est ce que la syntaxe de ma 2e requète (avec
lle not in et la sous requète) me renvoie bien tous les tuples de la 1ere
table n'ayant aucune correspondance dans la 2e ?


"Frédéric D" a écrit dans le message de
news:
> Bonjour
>
> je sens que je vais poser une question de débutant posée 10000 fois, mais
en
> cherchant, je n'ai pas trouvé, et cela dépasse mes pauvres capacités en
SQL
> :
> je souhaite selectionner les enregistrements d'une table qui n'ont aucune
> correspondance dans une autre table.
>
> Je sais remonter les lignes qui ont une correspondance exacte avec une
> jointure interne :
> select distinct b.long_name from editorial b inner join
> marketprint1.dbo.objects a on (a.id_obj = b.record_id)
> cela me renvoie 167 lignes
> mais pour trouver ceux qui n'en ont aucune je suis tenté d'écrire :
> select distinct b.long_name from editorial b inner join
> marketprint1.dbo.objects a on NOT (a.id_obj = b.record_id) ou
> select distinct b.long_name from editorial b inner join
> marketprint1.dbo.objects a on (a.id_obj <> b.record_id)
> cela me renvoie 432 lignes
>
> donc au total 432+167 = 599 lignes
>
> problème : dans ma table editorial, je n'ai que 432 lignes. donc si je
> comprends bien, les 2 syntaxes que je propose ne me renvoie que les
> enregistrements qui ont au moins une non-correspondance, mais pas ceux qui
> n'en ont aucune.
>
> Je ne vois pas comment faire. Quelqu'un saurait il m'aider ? Merci
d'avance
>
>




Avatar
Fred BROUARD
la réponse généraliste :
http://sqlpro.developpez.com/SQL_AZ_4.html#ENSEMBLEexcept

A +

Frédéric D a écrit:
Bonjour

je sens que je vais poser une question de débutant posée 10000 fois, mais en
cherchant, je n'ai pas trouvé, et cela dépasse mes pauvres capacités en SQL
:
je souhaite selectionner les enregistrements d'une table qui n'ont aucune
correspondance dans une autre table.

Je sais remonter les lignes qui ont une correspondance exacte avec une
jointure interne :
select distinct b.long_name from editorial b inner join
marketprint1.dbo.objects a on (a.id_obj = b.record_id)
cela me renvoie 167 lignes
mais pour trouver ceux qui n'en ont aucune je suis tenté d'écrire :
select distinct b.long_name from editorial b inner join
marketprint1.dbo.objects a on NOT (a.id_obj = b.record_id) ou
select distinct b.long_name from editorial b inner join
marketprint1.dbo.objects a on (a.id_obj <> b.record_id)
cela me renvoie 432 lignes

donc au total 432+167 = 599 lignes

problème : dans ma table editorial, je n'ai que 432 lignes. donc si je
comprends bien, les 2 syntaxes que je propose ne me renvoie que les
enregistrements qui ont au moins une non-correspondance, mais pas ceux qui
n'en ont aucune.

Je ne vois pas comment faire. Quelqu'un saurait il m'aider ? Merci d'avance





--
Frédéric BROUARD - expert SQL, spécialiste : SQL Server / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
****************** mailto: ******************