|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre éclairé
![]() Étudiant Inscription : novembre 2007 Messages : 594 ![]() |
Bonjour a tous,
J'ai un soucis concernant une requête SQL sous SQL Server. J'ai une requête me retournant un resultat qui ressemble a ceci 1 | X1 | X | X ..... 2 | X2 | X | X ..... 1 | X | X | X ..... 2 | X | X | X ..... 3 | X3 | X | X ..... 2 | X | X | X ..... 1 | X | X | X ..... 2 | X | X | X ..... et je voudrais obtenir ceci : 1 | X1 | X | X ..... 2 | X2 | X | X ..... 3 | X3 | X | X ..... J'avoue que je bloque totalement, j'ai essaye avec DISTINCT le problème est que ça prend toutes les colonne et pas seulement la première. Group by sans succès... Si vous avez une idée, n’hésitez pas ! Merci d'avance. NeoKript |
|
|
00
|
|
|
#2 |
![]() ![]() |
Quelle est la règle de sélection ?
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#3 | ||
|
Membre éclairé
![]() Étudiant Inscription : novembre 2007 Messages : 594 ![]() |
La requête que j'utilise actuellement, ressemble a cela : (j'ai renomme les champs et tables) :
Code :
En gros, c'est un join entre 3 table et j'aimerai que la colonne [X].[Id] soit unique. Merci encore |
||
|
|
00
|
|
|
#4 |
![]() ![]() |
Pour commencer, selon la norme SQL et depuis 1992, les jointures s'écrivent avec JOIN. Près de 20 ans plus tard, il serait temps de s'y mettre !
![]() Par définition, ID est unique dans la table X1 non ? C'est la jointure avec les autres tables qui produit potentiellement plusieurs lignes pour chaque valeur de X1.ID ? Je pose alors la même question que Waldar : Comment choisir parmi ces multiples lignes pour une valeur de X1.ID quelle ligne doit être conservée ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
00
|
|
|
#5 | |||
|
Membre éclairé
![]() Étudiant Inscription : novembre 2007 Messages : 594 ![]() |
Citation:
![]() Id est bien unique (Cle primaire auto incrémente) Citation:
Citation:
Id | C2 | C3 | C4..... (C2 = Colonne 2... X = Valeur sans importance) --------------------- 1 | X1 | X | X ..... 2 | X2 | X | X ..... 1 | X | X | X ..... 2 | X | X | X ..... 3 | X3 | X | X ..... 2 | X | X | X ..... 1 | X | X | X ..... 2 | X | X | X ..... Je voudrait que le résultat précédent devienne Id | C2 | C3 | C4..... --------------------- 1 | X1 | X | X ..... 2 | X2 | X | X ..... 3 | X3 | X | X ..... Les lignes du premier tableau sont trier par Date (Voir ORDER BY de la requête) et j'aimerai prendre toutes les premières valeurs afin de ne pas avoir de Id duplique.. Si ce n'est pas claire dite moi, j’essaierai de mieux expliquer. Merci encore. NeoKript |
|||
|
|
00
|
|
|
#6 |
![]() ![]() |
Voilà ce que c'est de vouloir faire des abstractions trop fortes par rapport aux données réelles !
Dans ta requête, tu manipules les colonnes X.A, X.ID, Z.Name, Y.B, Y.ModificationDateTime, et X.C et dans ton dernier exemple de données tu présentes Id, C2, C3, C4. Comment veux-tu qu'on s'y retrouve ? ![]() Alors lis les règles du forum et applique-les, si besoin en changeant les noms et autres informations confidentielles mais avec un jeu de données qui ressemble au réel et un résultat attendu correspondant au jeu de données fourni !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
00
|
|
|
#7 |
![]() ![]() |
Et aussi, quelle version de SQL-Server ?
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#8 | ||||||
|
Membre éclairé
![]() Étudiant Inscription : novembre 2007 Messages : 594 ![]() |
La BDD utilisée est SQL Server 2005
Alors voila la requête, j'ai juste changer le nom des tables en Table 1, Table 2, histoire que ce soit plus clair. Code :
Résultat : Code :
Code :
|
||||||
|
|
00
|
|
|
#9 | ||
![]() ![]() |
Ok c'est maintenant parfaitement clair.
Essayez ainsi : Code :
__________________
Email : http://scr.im/waldar |
||
|
00
|
|
|
#10 | |||
![]() ![]() |
Que d'erreurs dans cette requête !
![]() FAUX ! C'est IS NULL ! Le seul cas où on doit écrire = NULL est dans une requête UPDATE pour mettre à NULL une colonne. En essayant de normaliser l'écriture de ta requête, je constate qu'il manque une condition de jointure pour Table2 ! Tu t'en serais aperçu en écrivant correctement la requête ! ![]() Mais en réalité, si j'interprète correctement la requête, ce qui demeure difficile avec l'abstraction du nom des tables et le manque d'information sur leur structure et ce qu'elles contiennent, il me semble que la dernière restriction du WHERE est en fait une jointure de Table1 avec Table4 puis une jointure de Table4 avec Table2, ce qui devrait être plus performant qu'une sous-requête corrélée. [Beurk !] [on] [dirait] [de] [l'access !] Dans la phrase ci-dessus, seuls les premiers et derniers crochets sont nécessaires car ce ne sont pas des noms conformes et dans ta requête aucun ne l'est ! Ça facilite l'écriture et la lecture de la requête. L'utilisation d'alias courts faciliterait aussi l'écriture et la lecture de la requête ! Citation:
Et au passage, ID textuel, c'est pas top ! ![]() La requête deviendrait celle-ci : Code :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|||
|
00
|
|
|
#11 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
bonjour,
ou cela : Code SQL :
Avec éventuellement (selon votre besoin) un filtre (dans le cross apply) pour ne récupérer que les ligne dans l'etat 'READY' |
||
|
|
00
|
|
|
#12 |
|
Membre éclairé
![]() Étudiant Inscription : novembre 2007 Messages : 594 ![]() |
Salut !
Merci pour vos réponses, la requête de Waldar fonctionne parfaitement, je vais essayer celle de aieeeuuuuu. Je ne connaissais pas la clause WITH ni la clause CROSS APPLY. Pour les Id textuels, ce n'est pas moi qui ai créé les tables sinon ça serait AI de partout. Et pour le IS NULL, j'en prends note ! Merci pour tout. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com