OVH Cloud OVH Cloud

Sélectionner des enregistrements qui contiennent plusieurs 2-uplet...

5 réponses
Avatar
Gilles TOURREAU
Bonjour tout le monde !

Voilà j'ai une table suivante :

|N°Case | Val1 | Val2 |
1 x1 y1
1 x2 y2
1 x3 y3
1 x4 y4
1 x5 y5
2 x1 y1
2 x2 y2
2 x4 y4
3 x1 y1
3 x3 y3
4 x2 y2

L'utilisateur saisie dans un tableau :

x1 et y1
x2 et y2
x3 et y3

Je dois essayer de trouver tous les "n°Case" de cette table qui
contiennent au moins ces trois 2-uplet saisie par l'utilisateur (dans
mon exemple la case n°1 est la solution)...

Pour corser le tout, il faudrait que cette requete puisse être executé
avec n'importe quel nombre de 2-uplet (ici j'ai fais avec 3 2-uplet,
mais l'utilisateur peut saisir aussi n 2-uplet)

En vous remerciant par avance de vos lumières...

Cordialement

--
Gilles TOURREAU
Responsable Informatique
gilles.tourreau@pos.fr

Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr

5 réponses

Avatar
Jean Christophe CHENIS
Bonjour
En supposant que la table des n-uplets saisis par les utilisateurs
(TableUsr) et celle contenant les numéros de Case (TableRef) ne contiennent
pas de doublons, je vous propose la requète suivante :
Celle ci s'appuie sur le fait que le nombre de lignes retournées par le
premier SELECT corresponde au nombre de n-uplets utilisateurs (dans
TableUsr)

SELECT
Ref.Ref_Case
FROM TableUsr Usr
JOIN TableRef Ref
ON (Usr.usr_Val1 = Ref.ref_Val1
AND Usr.usr_Val2 = Ref.ref_Val2)

GROUP BY Ref.ref_case
HAVING count(Ref.Ref_case)= (SELECT count(*) FROM TableUsr)

En espérant que cela vous aidera.
Cdt

Jean-Christophe CHENIS



"Gilles TOURREAU" a écrit dans le message de news:

Bonjour tout le monde !

Voilà j'ai une table suivante :

|N°Case | Val1 | Val2 |
1 x1 y1
1 x2 y2
1 x3 y3
1 x4 y4
1 x5 y5
2 x1 y1
2 x2 y2
2 x4 y4
3 x1 y1
3 x3 y3
4 x2 y2

L'utilisateur saisie dans un tableau :

x1 et y1
x2 et y2
x3 et y3

Je dois essayer de trouver tous les "n°Case" de cette table qui
contiennent au moins ces trois 2-uplet saisie par l'utilisateur (dans mon
exemple la case n°1 est la solution)...

Pour corser le tout, il faudrait que cette requete puisse être executé
avec n'importe quel nombre de 2-uplet (ici j'ai fais avec 3 2-uplet, mais
l'utilisateur peut saisir aussi n 2-uplet)

En vous remerciant par avance de vos lumières...

Cordialement

--
Gilles TOURREAU
Responsable Informatique


Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr




Avatar
Gilles TOURREAU
Jean Christophe CHENIS avait soumis l'idée :
Bonjour
En supposant que la table des n-uplets saisis par les utilisateurs (TableUsr)
et celle contenant les numéros de Case (TableRef) ne contiennent pas de
doublons, je vous propose la requète suivante :
Celle ci s'appuie sur le fait que le nombre de lignes retournées par le
premier SELECT corresponde au nombre de n-uplets utilisateurs (dans TableUsr)

SELECT
Ref.Ref_Case
FROM TableUsr Usr
JOIN TableRef Ref
ON (Usr.usr_Val1 = Ref.ref_Val1
AND Usr.usr_Val2 = Ref.ref_Val2)

GROUP BY Ref.ref_case
HAVING count(Ref.Ref_case)= (SELECT count(*) FROM TableUsr)

En espérant que cela vous aidera.
Cdt

Jean-Christophe CHENIS



"Gilles TOURREAU" a écrit dans le message de news:

Bonjour tout le monde !

Voilà j'ai une table suivante :

|N°Case | Val1 | Val2 |
1 x1 y1
1 x2 y2
1 x3 y3
1 x4 y4
1 x5 y5
2 x1 y1
2 x2 y2
2 x4 y4
3 x1 y1
3 x3 y3
4 x2 y2

L'utilisateur saisie dans un tableau :

x1 et y1
x2 et y2
x3 et y3

Je dois essayer de trouver tous les "n°Case" de cette table qui contiennent
au moins ces trois 2-uplet saisie par l'utilisateur (dans mon exemple la
case n°1 est la solution)...

Pour corser le tout, il faudrait que cette requete puisse être executé avec
n'importe quel nombre de 2-uplet (ici j'ai fais avec 3 2-uplet, mais
l'utilisateur peut saisir aussi n 2-uplet)

En vous remerciant par avance de vos lumières...

Cordialement

-- Gilles TOURREAU
Responsable Informatique


Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr







Merci pour cette solution, mais le problème c'est que je ne peux pas
modifier la base de données en ajoutant une table "temporaire"...
Je cherche donc une requête SQL qui utilise uniquement la table déjà
présente (au pire s'il faut que la requête soit créer créer de manière
dynamique ce n'est pas un problème, car ca sera l'application
utilisateur qui pourra le faire)...

D'autres idées ?

Cordialement

--
Gilles TOURREAU
Responsable Informatique


Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
Avatar
Gilles TOURREAU
Gilles TOURREAU a utilisé son clavier pour écrire :
Jean Christophe CHENIS avait soumis l'idée :
Bonjour
En supposant que la table des n-uplets saisis par les utilisateurs
(TableUsr) et celle contenant les numéros de Case (TableRef) ne contiennent
pas de doublons, je vous propose la requète suivante :
Celle ci s'appuie sur le fait que le nombre de lignes retournées par le
premier SELECT corresponde au nombre de n-uplets utilisateurs (dans
TableUsr)

SELECT
Ref.Ref_Case
FROM TableUsr Usr
JOIN TableRef Ref
ON (Usr.usr_Val1 = Ref.ref_Val1
AND Usr.usr_Val2 = Ref.ref_Val2)

GROUP BY Ref.ref_case
HAVING count(Ref.Ref_case)= (SELECT count(*) FROM TableUsr)

En espérant que cela vous aidera.
Cdt

Jean-Christophe CHENIS



"Gilles TOURREAU" a écrit dans le message de news:

Bonjour tout le monde !

Voilà j'ai une table suivante :

|N°Case | Val1 | Val2 |
1 x1 y1
1 x2 y2
1 x3 y3
1 x4 y4
1 x5 y5
2 x1 y1
2 x2 y2
2 x4 y4
3 x1 y1
3 x3 y3
4 x2 y2

L'utilisateur saisie dans un tableau :

x1 et y1
x2 et y2
x3 et y3

Je dois essayer de trouver tous les "n°Case" de cette table qui
contiennent au moins ces trois 2-uplet saisie par l'utilisateur (dans mon
exemple la case n°1 est la solution)...

Pour corser le tout, il faudrait que cette requete puisse être executé
avec n'importe quel nombre de 2-uplet (ici j'ai fais avec 3 2-uplet, mais
l'utilisateur peut saisir aussi n 2-uplet)

En vous remerciant par avance de vos lumières...

Cordialement

-- Gilles TOURREAU
Responsable Informatique


Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr







Merci pour cette solution, mais le problème c'est que je ne peux pas modifier
la base de données en ajoutant une table "temporaire"...
Je cherche donc une requête SQL qui utilise uniquement la table déjà présente
(au pire s'il faut que la requête soit créer créer de manière dynamique ce
n'est pas un problème, car ca sera l'application utilisateur qui pourra le
faire)...

D'autres idées ?

Cordialement



Je me réponds à moi-même il suffit de faire une belle intersection
comme-ceci :

SELECT * FROM Table WHERE N°Case IN (

SELECT N°Case FROM Table WHERE Val1 = 'x1' AND Val2 = 'x2'
INTERSECT
SELECT N°Case FROM Table WHERE Val1 = 'x2' AND Val2 = 'x2'
INTERSECT
SELECT N°Case FROM Table WHERE Val1 = 'x3' AND Val2 = 'x3'

)

Le seul inconvénient c'est que cette requête est dynamique et qu'il
faut la créer par programmation...

A moins que quelqu'un a une autre meilleure idée ?

Cordialement

--
Gilles TOURREAU
Responsable Informatique


Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
Avatar
Gilles TOURREAU
Gilles TOURREAU a formulé la demande :
Jean Christophe CHENIS avait soumis l'idée :
Bonjour
En supposant que la table des n-uplets saisis par les utilisateurs
(TableUsr) et celle contenant les numéros de Case (TableRef) ne contiennent
pas de doublons, je vous propose la requète suivante :
Celle ci s'appuie sur le fait que le nombre de lignes retournées par le
premier SELECT corresponde au nombre de n-uplets utilisateurs (dans
TableUsr)

SELECT
Ref.Ref_Case
FROM TableUsr Usr
JOIN TableRef Ref
ON (Usr.usr_Val1 = Ref.ref_Val1
AND Usr.usr_Val2 = Ref.ref_Val2)

GROUP BY Ref.ref_case
HAVING count(Ref.Ref_case)= (SELECT count(*) FROM TableUsr)

En espérant que cela vous aidera.
Cdt

Jean-Christophe CHENIS



"Gilles TOURREAU" a écrit dans le message de news:

Bonjour tout le monde !

Voilà j'ai une table suivante :

|N°Case | Val1 | Val2 |
1 x1 y1
1 x2 y2
1 x3 y3
1 x4 y4
1 x5 y5
2 x1 y1
2 x2 y2
2 x4 y4
3 x1 y1
3 x3 y3
4 x2 y2

L'utilisateur saisie dans un tableau :

x1 et y1
x2 et y2
x3 et y3

Je dois essayer de trouver tous les "n°Case" de cette table qui
contiennent au moins ces trois 2-uplet saisie par l'utilisateur (dans mon
exemple la case n°1 est la solution)...

Pour corser le tout, il faudrait que cette requete puisse être executé
avec n'importe quel nombre de 2-uplet (ici j'ai fais avec 3 2-uplet, mais
l'utilisateur peut saisir aussi n 2-uplet)

En vous remerciant par avance de vos lumières...

Cordialement

-- Gilles TOURREAU
Responsable Informatique


Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr







Merci pour cette solution, mais le problème c'est que je ne peux pas modifier
la base de données en ajoutant une table "temporaire"...
Je cherche donc une requête SQL qui utilise uniquement la table déjà présente
(au pire s'il faut que la requête soit créer créer de manière dynamique ce
n'est pas un problème, car ca sera l'application utilisateur qui pourra le
faire)...

D'autres idées ?

Cordialement



Je me réponds à moi-même il suffit de faire une belle intersection
comme-ceci :

SELECT * FROM Table WHERE N°Case IN (

SELECT N°Case FROM Table WHERE Val1 = 'x1' AND Val2 = 'x2'
INTERSECT
SELECT N°Case FROM Table WHERE Val1 = 'x2' AND Val2 = 'x2'
INTERSECT
SELECT N°Case FROM Table WHERE Val1 = 'x3' AND Val2 = 'x3'

)

Le seul inconvénient c'est que cette requête est dynamique et qu'il
faut la créer par programmation...

A moins que quelqu'un a une autre meilleure idée ?

Cordialement

--
Gilles TOURREAU
Responsable Informatique


Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
Avatar
Fred BROUARD
Gilles TOURREAU a écrit :


Merci pour cette solution, mais le problème c'est que je ne peux pas
modifier la base de données en ajoutant une table "temporaire"...
Je cherche donc une requête SQL qui utilise uniquement la table déjà
présente (au pire s'il faut que la requête soit créer créer de manière
dynamique ce n'est pas un problème, car ca sera l'application
utilisateur qui pourra le faire)...

D'autres idées ?






Plus simple à écrire, plus performant à executer :

SELECT *
FROM Table T
WHERE EXISTS(SELECT *
FROM (SELECT 'x1' AS Val1, 'y1' AS Val2
UNION ALL
SELECT 'x2' AS Val1, 'y2' AS Val2
UNION ALL
SELECT 'x3' AS Val1, 'y3' AS Val2) TT ) TTT
WHERE T.Val1 = TTT.val1
AND T.val2 = TTT.val2 )

La seule partie à récrire est :

SELECT 'x1' AS Val1, 'y1' AS Val2
UNION ALL
SELECT 'x2' AS Val1, 'y2' AS Val2
UNION ALL
SELECT 'x3' AS Val1, 'y3' AS Val2

Donc SQL Dynamique !

A +

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************




Cordialement



Je me réponds à moi-même il suffit de faire une belle intersection
comme-ceci :

SELECT * FROM Table WHERE N°Case IN (

SELECT N°Case FROM Table WHERE Val1 = 'x1' AND Val2 = 'x2'
INTERSECT
SELECT N°Case FROM Table WHERE Val1 = 'x2' AND Val2 = 'x2'
INTERSECT
SELECT N°Case FROM Table WHERE Val1 = 'x3' AND Val2 = 'x3'

)

Le seul inconvénient c'est que cette requête est dynamique et qu'il faut
la créer par programmation...

A moins que quelqu'un a une autre meilleure idée ?

Cordialement