![]() |
| Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé. | |||||||
|
|||||||
| SQL Forum d'entraide sur le SQL pour Firebird |
![]() |
|
|
Outils de la discussion |
|
|
#1 (permalink) |
![]() |
Bonjour à tous,
Je cherche à exécuter une requête de ce type : (Il s'agit juste d'un exemple pour montrer la syntaxe que je recherche) Code :
SELECT b1.champ1 FROM base b1 WHERE (b1.champ2, b1.champ3) IN ( SELECT DISTINCT b2.champ2, b2.champ3 FROM base b2 WHERE b2.id = 5 ) J'ai bien effectué une recherche mais aucuns résultat... Merci d'avance pour vos réponses. |
|
|
|
|
|
#3 (permalink) | ||
![]() |
Bon, ça ne m'arrange pas du tout, du coup
Voici la structure simplifiée de la table sur laquelle je suis en train de travailler : Code :
CREATE TABLE NEW_DIAGNOSTIC( ID INTEGER, CREATIONDATE DATE NOT NULL, CREATIONTIME TIME NOT NULL, PATIENT_ID INTEGER NOT NULL, DIAGNOSTIC_ID INTEGER NOT NULL, CONSTRAINT NEW_DIAGNOSTIC_PK PRIMARY KEY(ID), CONSTRAINT NEW_DIAGNOSTIC_PATIENT_FK FOREIGN KEY(PATIENT_ID) REFERENCES PATIENT(ID), CONSTRAINT NEW_DIAGNOSTIC_DIAGNOSTIC_FK FOREIGN KEY(DIAGNOSTIC_ID) REFERENCES DIAGNOSTIC(ID) ); Citation:
Citation:
Donc dans mon cas, je devrais avoir les ID 12 (puisqu'il n'y en à qu'un seul pour le couple 3/8) et 8 pour le couple 1/8 car c'est le plus ancien. Donc, la clause IN avec plusieurs colonnes m'aurait vraiment bien aidé pour faire ça, du coup, je ne sais pas trop comment m'y prendre. J'hésite même à traiter directement les données en C++... Si vous avez une piste ou solution je suis preneur. |
||
|
|
|
|
|
#4 (permalink) |
|
Membre Expert
![]() ![]() Date d'inscription: mai 2002
Messages: 1 289
|
pardon ? avec le IN oracle ça s'écrirait comment ?
pour être sûr de bien comprendre parce qu'à priori voilà : Code :
WITH N2 (PATIENT_ID,DIAGNOSTIC_ID,CREATIONDATE,CREATIONTIME) AS (SELECT N1.PATIENT_ID,N1.DIAGNOSTIC_ID ,MIN(N1.CREATIONDATE),MIN(N1.CREATIONTIME) FROM NEW_DIAGNOSTIC N1 WHERE N1.PATIENT_ID=8 GROUP BY N1.PATIENT_ID ,N1.DIAGNOSTIC_ID) SELECT ND.ID FROM NEW_DIAGNOSTIC ND JOIN N2 ON ( N2.PATIENT_ID=ND.PATIENT_ID AND N2.DIAGNOSTIC_ID=ND.DIAGNOSTIC_ID AND N2.CREATIONDATE=ND.CREATIONDATE ) Code :
SELECT ND.ID FROM NEW_DIAGNOSTIC ND JOIN (SELECT N1.PATIENT_ID,N1.DIAGNOSTIC_ID ,MIN(N1.CREATIONDATE) CREATIONDATE,MIN(N1.CREATIONTIME) CREATIONTIME FROM NEW_DIAGNOSTIC N1 WHERE N1.PATIENT_ID=8 GROUP BY N1.PATIENT_ID ,N1.DIAGNOSTIC_ID) N2 ON ( N2.PATIENT_ID=ND.PATIENT_ID AND N2.DIAGNOSTIC_ID=ND.DIAGNOSTIC_ID AND N2.CREATIONDATE=ND.CREATIONDATE )
__________________
Philippe Makowski IBPhoenix - Firebird Membre de l'April Dernière modification par makowski ; 20/08/2008 à 00h03 |
|
|
|
|
|
#5 (permalink) | |
![]() |
Bon, ça fait un moment que je n'ai pas fait de SQL, donc ce n'est certainement pas optimisé ce que j'aurais fait, mais j'aurais eu un début de piste comme ceci :
(je n'y ai pas trop réfléchi puisque j'ai eu tout de suite le problème avec le IN). Code :
SELECT id, MIN(creationdate) FROM new_diagnostic WHERE patient_id = 8 AND (diagnostic_id, patient_id) IN ( SELECT DISTINCT diagnostic_id, patient_id FROM new_diagnostic WHERE patient_id = 8 ) GROUP BY id; Merci pour ton aide, la seconde requête fonctionne super, la première, il y a une erreur de syntaxe à la première ligne. Je vais chercher pour voir comment fonctionne le WITH, cette fonction a l'air intéressante. Petite question subsidiaire : Avec la seconde requête : Citation:
|
|
|
|
|
|
|
#6 (permalink) |
|
Membre Expert
![]() ![]() Date d'inscription: mai 2002
Messages: 1 289
|
Le WITH a été introduit dans la version Firebird 2.1 (Common Table Expressions : http://www.firebirdsql.org/rlsnotesh...ml#rnfb210-cte)
et pardon oui, il est préférable de faire : Code :
SELECT ND.ID FROM NEW_DIAGNOSTIC ND JOIN (SELECT N1.PATIENT_ID,N1.DIAGNOSTIC_ID ,MIN(CAST(N1.CREATIONDATE||' '||N1.CREATIONTIME AS TIMESTAMP)) CREATIONDATETIME FROM NEW_DIAGNOSTIC N1 WHERE N1.PATIENT_ID=8 GROUP BY N1.PATIENT_ID ,N1.DIAGNOSTIC_ID) N2 ON ( N2.PATIENT_ID=ND.PATIENT_ID AND N2.DIAGNOSTIC_ID=ND.DIAGNOSTIC_ID AND N2.CREATIONDATETIME=(CAST(ND.CREATIONDATE||' '||ND.CREATIONTIME AS TIMESTAMP)) ) Code :
WITH N2 (PATIENT_ID,DIAGNOSTIC_ID,CREATIONDATETIME) AS (SELECT N1.PATIENT_ID,N1.DIAGNOSTIC_ID ,MIN(CAST(N1.CREATIONDATE||' '||N1.CREATIONTIME AS TIMESTAMP)) FROM NEW_DIAGNOSTIC N1 WHERE N1.PATIENT_ID=8 GROUP BY N1.PATIENT_ID ,N1.DIAGNOSTIC_ID) SELECT ND.ID FROM NEW_DIAGNOSTIC ND JOIN N2 ON ( N2.PATIENT_ID=ND.PATIENT_ID AND N2.DIAGNOSTIC_ID=ND.DIAGNOSTIC_ID AND N2.CREATIONDATETIME=(CAST(ND.CREATIONDATE||' '||ND.CREATIONTIME AS TIMESTAMP)) )
__________________
Philippe Makowski IBPhoenix - Firebird Membre de l'April |
|
|
|
![]() |
![]() |
||
Syntaxe du IN avec plusieurs colonnes
|
||
Offres d'
emploi informatique
sur Lesjeudis.com
|
| Outils de la discussion | |
|
|