|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Membre du Club
![]() Inscription : juillet 2004 Messages : 200 ![]() |
Code :
Quelle est la syntaxe permettant de faire le même type d'opérations avec Interbase ? (message d'erreur : token unknown from) Message édité par Barbibulle : Merci d'utiliser les balises "Code" pour une meilleur lecture de vos messages. |
||
|
|
00
|
|
|
#2 | ||
|
Membre Expert
![]() Frédéric Inscription : octobre 2002 Messages : 1 722 ![]() |
Je ne sais pas si votre ordre fonctionne bien sous SyBase mais la norme SQL veut dans ce cas là qu'on utilise un sous select.
Et celà s'écrit comme ceci : Code :
|
||
|
|
00
|
|
|
#3 |
|
Membre du Club
![]() Inscription : juillet 2004 Messages : 200 ![]() |
Sur Sybase ça a bien marché pendant un an toute les nuits.
Cela dit la syntaxe proposée renvoie le message "multiple rows un singleton select" sur Interbase car dans ce cas la clause select remplace une valeur constante qui va être affectée à toutes les lignes de la table client. Cela n'est pas ce que je souhaite. je souhaite faire une jointure qui permet de donner des valeurs différentes à chaque ligne concernée de la table client. Il faut donc nécessairement que la table client possède une clause where dans la clause update. Dans le sujet curseur j'explique comment j'ai résolu le problème. |
|
|
00
|
|
|
#4 | |||
|
Membre Expert
![]() Frédéric Inscription : octobre 2002 Messages : 1 722 ![]() |
Citation:
Citation:
Citation:
Un update de la colonne type_client de la table client mais avec plusieures valeurs ?? |
|||
|
|
00
|
|
|
#5 |
|
Membre du Club
![]() Inscription : juillet 2004 Messages : 200 ![]() |
c'est simple
voici la table client code-client type client 0, null 1, null 2, C voici la table conrimm code-client type client 0,A 1,X 2,Z Lorsque la requête sera executée j'aurai une table client comme cici code-client type client 0, A 1, X 2, Z Il s'agit d'une mise à jour avec jointure. Je ne sais toujours pas si cela peut se faire avec Interbase d'ailleurs. Cela dit le problème est résolu avec un for select et une procédure d'usage éphemère. ps : je ne comprends pas l'allusion à une faute de frappe. |
|
|
00
|
|
|
#6 | |||||
|
Membre Expert
![]() Frédéric Inscription : octobre 2002 Messages : 1 722 ![]() |
Citation:
Et je maintient ce que j'ai dit au départ (après relecture je m'apperçois que j'ai fait une erreur) : Code :
Et donc cette update fonctionnera uniquement si le Code :
Ce qui est le cas dans votre exemple. |
|||||
|
|
00
|
|
|
#7 |
|
Membre du Club
![]() Inscription : juillet 2004 Messages : 200 ![]() |
Euh non pas tout à fait, dans mon exemple on a trois mises à jour successives parce que la jointure envoie trois valeurs qui servent d'index à la mise à jour.
Quelle est à votre avis la synatxe permettant de faire cela en Interbase ? J'a essayé ceci update client contrimm set client.type_client=contrimm.type_client where client.code_client=contrimm.code_client qui ne déclenche pas de message d'erreur mais ne fait pas non plus la mise à jour. |
|
|
00
|
|
|
#8 | ||
|
Membre Expert
![]() Frédéric Inscription : octobre 2002 Messages : 1 722 ![]() |
Je maintiens ce que j'ai dit l'update que je vous ai donné fonctionne parfaitement avec le jeux de données que vous avez donné.
car le sous select : Code :
Si l'update que je vous ai donné ne fonctionne pas et notamment donne le message d'erreur : "multiple rows un singleton select" C'est qu'il y a des doublons (sur la colonne code_client) dans votre table vs_contrimm. Dans ce cas le SGBD ne sais pas faire et plutot que d'affecter une des valeurs possible vous indique qu'il y a un probleme. |
||
|
|
00
|
|
|
#9 |
|
Membre du Club
![]() Inscription : juillet 2004 Messages : 200 ![]() |
UPDATE titres
SET cumulannuel_ventes = cumulannuel_ventes qt FROM titres, ventes WHERE titres.id_titre = ventes.id_titre AND ventes.date_cmd in (SELECT MAX(ventes.date_cmd) FROM ventes) voici un exemple similaire extrait d'un cours Transac-SQL qui parait il est compatible avec Oracle et MS-SQL ce qui n'est déjà pas mal... |
|
|
00
|
|
|
#10 |
|
Membre du Club
![]() Inscription : juillet 2004 Messages : 200 ![]() |
Je vois ce que vous voulez dire concernant les doublons. Toutefois il faut bien dans la clause update (et en dehors du sous select) savoir quelle est la table correspondante au champ de contrimm servant à la mise à jour.
Par conséquent où doit être indiqué le nom de la table contrimm ? update client contrimm ne fait pas d'erreur mais ne met pas à jour la clause from n'existe pas dans update interbase update client,contrimm provoque une erreur de syntaxe |
|
|
00
|
|
|
#11 | ||||||||
|
Membre Expert
![]() Frédéric Inscription : octobre 2002 Messages : 1 722 ![]() |
Le probleme c'est que vous n'essayez même pas les solutions qu'on vous donnes donc à quoi ca sert de continuer ??
Je vais tout de même expliquer cet ordre SQL : Code :
réponse : la colonne Type_client de la table client. Ceci peut être fait comme grace à un update: Code :
Jusque là c'est simple. Mais ce c'est pas ce que vous cherchez. Vous voulez que type_client prenne la valeur de la colonne type_client de la table vs_contrimm qui a le même code_client. Comment rechercher la valeur type_client de la table vs_contrimm pour le client ayant le code_client=1 ? Code :
SELECT b.type_client FROM vs_contrimm WHERE b.Code_client=1 Code :
Heureusement dans le sous-select on peut utiliser les valeurs donnés par le UPDATE avant la mise à jour de chaque enregistrement et celà devient : Code :
|
||||||||
|
|
00
|
|
|
#12 | |||||
|
Membre Expert
![]() Frédéric Inscription : octobre 2002 Messages : 1 722 ![]() |
Citation:
Code :
|
|||||
|
|
00
|
|
|
#13 |
|
Membre du Club
![]() Inscription : juillet 2004 Messages : 200 ![]() |
Je ne vous permet pas de dire que je n'essaie pas ce qu'on me propose. C'est faux et discourtois. Vous êtes modérateur, par conséquent le moins serait que vous vous modériez vous même.
Je demande à la cantonnade s'il est possible de faire un update avec jointure sur 2 tables avec Interbase et il est possible que vous n'ayez pas la réponse, inutile de s'en prendre les uns aux autres. Dire que ceci update client contrimm set client.type_client=contrimm.type_client where client.code_client=contrimm.code_client est équivalent à cela update client set client.type_client = client.type_client me parait polémique et non technique. Merci à vous |
|
|
00
|
|
|
#14 | |||
|
Membre Expert
![]() Frédéric Inscription : octobre 2002 Messages : 1 722 ![]() |
Citation:
Si j'en suis arrivé à cette conclusion, c'est à cause de votre attitude, j'en suis désolé, c'est une constatation. Relisez bien attentivement tout ce fil de conversation plutot que de prendre la mouche, vous verez que toutes les reponses s'y trouvent. Avouez qu'il est assez ennervant pour une personne qui aide les autres que celui qui pose une question ne tienne pas compte des réponses ou du moins ne dise pas ce qui va ou ne va pas dans ce qui est proposé... Maintenant je suppose que l'incident est clos, si vous voulez continuer de parler du probleme non technique de courtoisie veuillez m'envoyer un message privé, car celà polue innutilement le forum et n'interresse personne ici bas. Citation:
NON, car la commande que vous avez donné ne fait pas parti de la norme SQL, elle est ppeut etre implémenté dans Sybase mais pas dans interbase/firebird. Citation:
En ce qui concerne les deux ordres SQL, ils sont bien equivallents, c'est la triste vérité, si vous ne le comprennez pas, demandez pourquoi ils sont equivallents plutot que de dire que c'est faux... Il ne faudrait pas inverser les roles, c'est vous qui avez un probleme, et qui posez des questions. |
|||
|
|
00
|
|
|
#15 |
|
Membre du Club
![]() Inscription : juillet 2004 Messages : 200 ![]() |
Inverser les rôles c'est vide dit et crée un présupposé sur nos rôles respectifs que je ne suis pas certain d'agréer. Jusqu'à preuve du contraire, nous sommes égaux.
Je pose en effet des questions, mais je ne lis que des critiques sur ma formulation et non des réponses aux questions posées. C'est une méthode hélàs courante quand on a pas la réponse de dire que la question est mal posée. J'ai résolu mon problème mais je reste curieux de savoir si j'aurais pu faire autrement et par conséquent en effet j'attends que vous m'expliquiez en quoi update client contrimm set client.type_client=contrimm.type_client where client.code_client=contrimm.code_client est équivalent à cela update client set client.type_client = client.type_client |
|
|
00
|
|
|
#16 | ||||
|
Membre actif
![]() |
bonjour,
votre question porte sur ce code qui ne me parait pas non plus (comme mon collègue) respecter le standard SQL! Code :
Code :
En espérant vous avoir aidé Cordialement Superstivix
__________________
Modérateur Taverne et C++Builder Règles du Club - Règles de la Taverne FAQ BCB - sources Et je mords |
||||
|
|
00
|
|
|
#17 |
|
Membre Expert
![]() Frédéric Inscription : octobre 2002 Messages : 1 722 ![]() |
Hélas comme je l'ai déjà signalé (en donnant le seul moyen SQL accepté par interbase pour ce type de mise à jour) on ne peux pas faire ça avec interbase.
La solution est celle que j'ai donnée, c'est à dire d'utiliser un sous-select. Mais ce n'est pas l'avis de tous apparemment Sinon il y a aussi la solution de le faire via une procédure stoquée, mais ce n'est pas ce qui est demandé ici. Par contre sous MS_server que fait cet ordre dans le cas ou dans vs_contrimm il y a plusieurs enregistrements correspondant à une CLE client ? Une erreur ? Si non quel enregistrement est pris en compte pour le mise à jour ? |
|
|
00
|
|
|
#18 | |
|
Membre actif
![]() |
Citation:
L'enregistrement pris pour la mise à jour est le dernier trouvé lorsqu'on fait un SELECT * FROM vs_contrimm.
__________________
Modérateur Taverne et C++Builder Règles du Club - Règles de la Taverne FAQ BCB - sources Et je mords |
|
|
|
00
|
|
|
#19 |
|
Membre Expert
![]() Frédéric Inscription : octobre 2002 Messages : 1 722 ![]() |
Donc c'est à utiliser en connaissance de cause.
S'il n'y a pas d'erreur c'est qu'il fait bien une jointure et il doit faire un UPDATE par ligne jointe. Ce qui veux dire que si une cle cliente à 100 000 référence dans vs_contrimm il y aura 100 000 update sur le même client (s'écrasant la même valeur à chaque fois) Il ne me semble pas que cette syntaxe fasse partie d'une des normes SQL. Mais je me trompe peut être. Ce qui est certain c'est que ce n'est pas implémenté dans Interbase. |
|
|
00
|
|
|
#20 |
|
Membre du Club
![]() Inscription : juillet 2004 Messages : 200 ![]() |
Inutile d'épiloguer sur des doublons dans la table contrimm de l'exemple, il n'y en a pas.
J'ai repris des tests et j'ai effectivement constaté que la syntaxe utilisant le sous select fonctionne. J'avais fait erreur dans la modification du copier-coller. Il n'y a en effet pas de clause FROM dans l'UPDATE d'Interbase (langref.pdf) mais l'évocation d'une table dans le sous select permet de faire une jointure avec celle citée dans l'Update. Milles excuses Barbibulle. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com