OVH Cloud OVH Cloud

Problème sur une requete

6 réponses
Avatar
Evariste
Bonjour,

Voici le problème.
J'ai une table principale des adresses et une table liée des contacts . une
adresse corresponds plusieurs contacts.
Adresse : IdAdresse, Nom, prenom
Contact : IdContact, idAdresse, contactNom

Je veux extraire les adresses dont les contacts sont Toto et titi.
Comment faire ?
Car si je fais select idadresse from adresse
left outer join Contact on adresse.IdAdresse = Contact.IdAdresse
where contact.ContactNom ='Toto' and Contact.ContactNom ='Titi'
cela me renvoi null et si je mets un Or je n'obtiens pas le résultat voulu
puisque je veux les adresses qui ont pour contact toto et titi
Merci d'avance.

6 réponses

Avatar
Sylvain Lafontaine
À vue de nez, vous devez utiliser la fonction Exists () associés à une
sous-requête:

Select idadresse, .... from adresse where Exists (select * from contact
where contact.IdAdresse = Adresse.IdAdresse and contact.ContactNom = 'Toto')
and Exists (select * from contact where contact.IdAdresse =
Adresse.IdAdresse and contact.ContactNom = 'Titi')

D'autres combinaisons d'opérateurs, comme par exemple l'utilisation de
l'opérateur IN, sont égalemet possible. De plus, dans ce genre de
situation, l'utilisation de tables temporaires est souvent hautement
désirable pour avoir du code simple à lire et performant en vitesse.

L'usage d'un LEFT OUTER JOIN ic à la place d'un INNER JOIN m'apparaît
également comme étant suspect d'après la description de votre problème.

S. L.

"Evariste" wrote in message
news:
Bonjour,

Voici le problème.
J'ai une table principale des adresses et une table liée des contacts .
une
adresse corresponds plusieurs contacts.
Adresse : IdAdresse, Nom, prenom
Contact : IdContact, idAdresse, contactNom

Je veux extraire les adresses dont les contacts sont Toto et titi.
Comment faire ?
Car si je fais select idadresse from adresse
left outer join Contact on adresse.IdAdresse = Contact.IdAdresse
where contact.ContactNom ='Toto' and Contact.ContactNom ='Titi'
cela me renvoi null et si je mets un Or je n'obtiens pas le résultat voulu
puisque je veux les adresses qui ont pour contact toto et titi
Merci d'avance.


Avatar
Fred BROUARD
-- les données

CREATE TABLE ADRESSE
(ID_ADRESSE INT NOT NULL PRIMARY KEY,
NOM VARCHAR(8),
PRENOM VARCHAR(8))

CREATE TABLE CONTACT
(ID_CONTACT INT NOT NULL PRIMARY KEY,
ID_ADRESSE INT REFERENCES ADRESSE (ID_ADRESSE),
CONTACT_NOM VARCHAR(8))

INSERT INTO ADRESSE VALUES (100, 'Pierre', 'DUPONT')
INSERT INTO ADRESSE VALUES (101, 'Marcel', 'CERDAN')
INSERT INTO ADRESSE VALUES (102, 'Alain', 'TERIEUR')
INSERT INTO ADRESSE VALUES (103, 'Alex', 'TERNE')

INSERT INTO CONTACT VALUES (1, 101, 'TOTO')
INSERT INTO CONTACT VALUES (2, 101, 'TITI')
INSERT INTO CONTACT VALUES (3, 103, 'TITI')
INSERT INTO CONTACT VALUES (4, 102, 'TOTO')

-- la solution

SELECT A.ID_ADRESSE
FROM ADRESSE A
LEFT OUTER JOIN CONTACT C
ON A.ID_ADRESSE = C.ID_ADRESSE
WHERE C.CONTACT_NOM IN ('TOTO', 'TITI')
GROUP BY A.ID_ADRESSE
HAVING COUNT(*) = 2

-- le résultat

ID_ADRESSE
-----------
101

A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste 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
************************ www.datasapiens.com *************************

Evariste a écrit:
Bonjour,

Voici le problème.
J'ai une table principale des adresses et une table liée des contacts . une
adresse corresponds plusieurs contacts.
Adresse : IdAdresse, Nom, prenom
Contact : IdContact, idAdresse, contactNom

Je veux extraire les adresses dont les contacts sont Toto et titi.
Comment faire ?
Car si je fais select idadresse from adresse
left outer join Contact on adresse.IdAdresse = Contact.IdAdresse
where contact.ContactNom ='Toto' and Contact.ContactNom ='Titi'
cela me renvoi null et si je mets un Or je n'obtiens pas le résultat voulu
puisque je veux les adresses qui ont pour contact toto et titi
Merci d'avance.


Avatar
Fred BROUARD
oulala Sylvain, tu pousse un peu ! ;-)

A +

Sylvain Lafontaine a écrit:
À vue de nez, vous devez utiliser la fonction Exists () associés à une
sous-requête:

Select idadresse, .... from adresse where Exists (select * from contact
where contact.IdAdresse = Adresse.IdAdresse and contact.ContactNom = 'Toto')
and Exists (select * from contact where contact.IdAdresse =
Adresse.IdAdresse and contact.ContactNom = 'Titi')

D'autres combinaisons d'opérateurs, comme par exemple l'utilisation de
l'opérateur IN, sont égalemet possible. De plus, dans ce genre de
situation, l'utilisation de tables temporaires est souvent hautement
désirable pour avoir du code simple à lire et performant en vitesse.

L'usage d'un LEFT OUTER JOIN ic à la place d'un INNER JOIN m'apparaît
également comme étant suspect d'après la description de votre problème.

S. L.

"Evariste" wrote in message
news:

Bonjour,

Voici le problème.
J'ai une table principale des adresses et une table liée des contacts .
une
adresse corresponds plusieurs contacts.
Adresse : IdAdresse, Nom, prenom
Contact : IdContact, idAdresse, contactNom

Je veux extraire les adresses dont les contacts sont Toto et titi.
Comment faire ?
Car si je fais select idadresse from adresse
left outer join Contact on adresse.IdAdresse = Contact.IdAdresse
where contact.ContactNom ='Toto' and Contact.ContactNom ='Titi'
cela me renvoi null et si je mets un Or je n'obtiens pas le résultat voulu
puisque je veux les adresses qui ont pour contact toto et titi
Merci d'avance.








--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste 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
************************ www.datasapiens.com *************************
Avatar
Sylvain Lafontaine
Oui, mais je ne vois toujours pas à quoi peut bien servir le LEFT OUTER JOIN
ici.

De plus, comme il y a eu un Group By, le résultat de la requête n'est pas
devenu Read-Only? Évidemment, il n'est peut-être pas intéressé à éditer les
valeurs obtenues.

S. L.

"Fred BROUARD" wrote in message
news:
-- les données

CREATE TABLE ADRESSE
(ID_ADRESSE INT NOT NULL PRIMARY KEY,
NOM VARCHAR(8),
PRENOM VARCHAR(8))

CREATE TABLE CONTACT
(ID_CONTACT INT NOT NULL PRIMARY KEY,
ID_ADRESSE INT REFERENCES ADRESSE (ID_ADRESSE),
CONTACT_NOM VARCHAR(8))

INSERT INTO ADRESSE VALUES (100, 'Pierre', 'DUPONT')
INSERT INTO ADRESSE VALUES (101, 'Marcel', 'CERDAN')
INSERT INTO ADRESSE VALUES (102, 'Alain', 'TERIEUR')
INSERT INTO ADRESSE VALUES (103, 'Alex', 'TERNE')

INSERT INTO CONTACT VALUES (1, 101, 'TOTO')
INSERT INTO CONTACT VALUES (2, 101, 'TITI')
INSERT INTO CONTACT VALUES (3, 103, 'TITI')
INSERT INTO CONTACT VALUES (4, 102, 'TOTO')

-- la solution

SELECT A.ID_ADRESSE
FROM ADRESSE A
LEFT OUTER JOIN CONTACT C
ON A.ID_ADRESSE = C.ID_ADRESSE
WHERE C.CONTACT_NOM IN ('TOTO', 'TITI')
GROUP BY A.ID_ADRESSE
HAVING COUNT(*) = 2

-- le résultat

ID_ADRESSE
-----------
101

A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste 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
************************ www.datasapiens.com *************************

Evariste a écrit:
Bonjour,

Voici le problème.
J'ai une table principale des adresses et une table liée des contacts .
une adresse corresponds plusieurs contacts.
Adresse : IdAdresse, Nom, prenom
Contact : IdContact, idAdresse, contactNom

Je veux extraire les adresses dont les contacts sont Toto et titi.
Comment faire ?
Car si je fais select idadresse from adresse
left outer join Contact on adresse.IdAdresse = Contact.IdAdresse
where contact.ContactNom ='Toto' and Contact.ContactNom ='Titi'
cela me renvoi null et si je mets un Or je n'obtiens pas le résultat
voulu puisque je veux les adresses qui ont pour contact toto et titi
Merci d'avance.





Avatar
Sylvain Lafontaine
Sans compter le fait que HAVING COUNT(*) = 2 est très restrictif et exclut
l'utilisation de clauses LIKE dans beaucoup de cas.

S. L.

"Sylvain Lafontaine" <sylvain aei ca (fill the blanks, no spam please)>
wrote in message news:
Oui, mais je ne vois toujours pas à quoi peut bien servir le LEFT OUTER
JOIN ici.

De plus, comme il y a eu un Group By, le résultat de la requête n'est pas
devenu Read-Only? Évidemment, il n'est peut-être pas intéressé à éditer
les valeurs obtenues.

S. L.

"Fred BROUARD" wrote in message
news:
-- les données

CREATE TABLE ADRESSE
(ID_ADRESSE INT NOT NULL PRIMARY KEY,
NOM VARCHAR(8),
PRENOM VARCHAR(8))

CREATE TABLE CONTACT
(ID_CONTACT INT NOT NULL PRIMARY KEY,
ID_ADRESSE INT REFERENCES ADRESSE (ID_ADRESSE),
CONTACT_NOM VARCHAR(8))

INSERT INTO ADRESSE VALUES (100, 'Pierre', 'DUPONT')
INSERT INTO ADRESSE VALUES (101, 'Marcel', 'CERDAN')
INSERT INTO ADRESSE VALUES (102, 'Alain', 'TERIEUR')
INSERT INTO ADRESSE VALUES (103, 'Alex', 'TERNE')

INSERT INTO CONTACT VALUES (1, 101, 'TOTO')
INSERT INTO CONTACT VALUES (2, 101, 'TITI')
INSERT INTO CONTACT VALUES (3, 103, 'TITI')
INSERT INTO CONTACT VALUES (4, 102, 'TOTO')

-- la solution

SELECT A.ID_ADRESSE
FROM ADRESSE A
LEFT OUTER JOIN CONTACT C
ON A.ID_ADRESSE = C.ID_ADRESSE
WHERE C.CONTACT_NOM IN ('TOTO', 'TITI')
GROUP BY A.ID_ADRESSE
HAVING COUNT(*) = 2

-- le résultat

ID_ADRESSE
-----------
101

A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste 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
************************ www.datasapiens.com *************************

Evariste a écrit:
Bonjour,

Voici le problème.
J'ai une table principale des adresses et une table liée des contacts .
une adresse corresponds plusieurs contacts.
Adresse : IdAdresse, Nom, prenom
Contact : IdContact, idAdresse, contactNom

Je veux extraire les adresses dont les contacts sont Toto et titi.
Comment faire ?
Car si je fais select idadresse from adresse
left outer join Contact on adresse.IdAdresse = Contact.IdAdresse
where contact.ContactNom ='Toto' and Contact.ContactNom ='Titi'
cela me renvoi null et si je mets un Or je n'obtiens pas le résultat
voulu puisque je veux les adresses qui ont pour contact toto et titi
Merci d'avance.









Avatar
Evariste
Merci à tous,

Je vais effectuer le test,mais a priori le count() semble restreindre
l'utilisation et effectivement je peux avoir besoin du like


"Sylvain Lafontaine" a écrit :

Sans compter le fait que HAVING COUNT(*) = 2 est très restrictif et exclut
l'utilisation de clauses LIKE dans beaucoup de cas.

S. L.

"Sylvain Lafontaine" <sylvain aei ca (fill the blanks, no spam please)>
wrote in message news:
> Oui, mais je ne vois toujours pas à quoi peut bien servir le LEFT OUTER
> JOIN ici.
>
> De plus, comme il y a eu un Group By, le résultat de la requête n'est pas
> devenu Read-Only? Évidemment, il n'est peut-être pas intéressé à éditer
> les valeurs obtenues.
>
> S. L.
>
> "Fred BROUARD" wrote in message
> news:
>> -- les données
>>
>> CREATE TABLE ADRESSE
>> (ID_ADRESSE INT NOT NULL PRIMARY KEY,
>> NOM VARCHAR(8),
>> PRENOM VARCHAR(8))
>>
>> CREATE TABLE CONTACT
>> (ID_CONTACT INT NOT NULL PRIMARY KEY,
>> ID_ADRESSE INT REFERENCES ADRESSE (ID_ADRESSE),
>> CONTACT_NOM VARCHAR(8))
>>
>> INSERT INTO ADRESSE VALUES (100, 'Pierre', 'DUPONT')
>> INSERT INTO ADRESSE VALUES (101, 'Marcel', 'CERDAN')
>> INSERT INTO ADRESSE VALUES (102, 'Alain', 'TERIEUR')
>> INSERT INTO ADRESSE VALUES (103, 'Alex', 'TERNE')
>>
>> INSERT INTO CONTACT VALUES (1, 101, 'TOTO')
>> INSERT INTO CONTACT VALUES (2, 101, 'TITI')
>> INSERT INTO CONTACT VALUES (3, 103, 'TITI')
>> INSERT INTO CONTACT VALUES (4, 102, 'TOTO')
>>
>> -- la solution
>>
>> SELECT A.ID_ADRESSE
>> FROM ADRESSE A
>> LEFT OUTER JOIN CONTACT C
>> ON A.ID_ADRESSE = C.ID_ADRESSE
>> WHERE C.CONTACT_NOM IN ('TOTO', 'TITI')
>> GROUP BY A.ID_ADRESSE
>> HAVING COUNT(*) = 2
>>
>> -- le résultat
>>
>> ID_ADRESSE
>> -----------
>> 101
>>
>> A +
>>
>> --
>> Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste 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
>> ************************ www.datasapiens.com *************************
>>
>> Evariste a écrit:
>>> Bonjour,
>>>
>>> Voici le problème.
>>> J'ai une table principale des adresses et une table liée des contacts .
>>> une adresse corresponds plusieurs contacts.
>>> Adresse : IdAdresse, Nom, prenom
>>> Contact : IdContact, idAdresse, contactNom
>>>
>>> Je veux extraire les adresses dont les contacts sont Toto et titi.
>>> Comment faire ?
>>> Car si je fais select idadresse from adresse
>>> left outer join Contact on adresse.IdAdresse = Contact.IdAdresse
>>> where contact.ContactNom ='Toto' and Contact.ContactNom ='Titi'
>>> cela me renvoi null et si je mets un Or je n'obtiens pas le résultat
>>> voulu puisque je veux les adresses qui ont pour contact toto et titi
>>> Merci d'avance.
>>
>
>