Select for update

Qu’est qui ne va pas dans ce code?

SELECT * FROM Nom2 where ID_No in (
SELECT ID_No
FROM Descr2
WHERE Nom_Latin = ‘’)
SELECT ‘UPDATE Descr2 SET Nom_Latin=’’, A.Nom_Latin, ‘’ WHERE ID_No=’, ID_No
FROM (select ID_No, Nom_Latin from Nom2 where ID_No in (select ID_No from Descr2 where Nom_Latin =’’))

merci
majella.larochelle@gmail.com

Ya trop de S, et tout le monde sait qu’en SQL faut pas qu’il y ait trop de S.

(Plus serieusement, si tu nous disais clairement ce que tu tentes de faire et ce que ca te donne comme resultat, ca nous aiderait).

Bonjour,

A défaut de te présenter, c’est un peu sec de poser une question brute de fonderie avec zéro messages, sans dire bonjour.

Ensuite il faudrait en savoir plus sur ton souci.
Que veux-tu faire ? (sélection ? Mise à jour ?)
Quelle est ta base de données ? (Oracle, SQL Server, Mysql, autre ?)
Vu que je vois des guillemets est-ce que c’est appelé par un environnement de dév quelconque ? (.NET, java, autre)
Quelle est le code erreur renvoyée ?

Sinon ton code SQL comporte trop d’erreurs pour pouvoir être corrigé.
On écrit en SQL : SELECT * FROM Ma_table
ou en SQL: UPDATE Ma_Table
ou en curseur (Transact SQL (SQL Server), PL/SQL(Oracle)), ex en Transact-SQL: declare c_mon_curseur cursor for select a from Ma_Table… for update

Autrement dit, à part dans les curseurs, on ne trouve jamais de update à la suite d’un SELECT.

De plus autant que possible on écrit de préférence les requêtes de la façon suivante, plutôt que d’imbriquer des IN à l’infini.

SELECT A.Col2, B.Col2 FROM Ma_Table A, Ma_Table B WHERE A.Col1=B.Col1
ou mieux encore

SELECT A.Col2, B.Col2 FROM Ma_Table A INNER JOIN Ma_Table B ON A.Col1=B.Col1

Les IN s’utilisent pour une recherche dans un sous-ensemble, et non pour faire une intersection entre deux ensembles. Dans ce dernier cas on utilise des jointures.
Ensuite seulement on utilise les sous-requêtes et les IN.

En me forçant à lire ton code, malgré qu’il pique les yeux et que tu n’expliques pas tes soucis (tout le monde a débuté un jour, mais je pense que tu ne t’es pas beaucoup penché sur la doc), voici ce que je propose en SQL Server (en Oracle c’est un peu plus compliqué)et dans le cas où tu veux faire une mise à jour:

UPDATE Descr2 A SET B.Nom_Latin FROM A INNER JOIN Nom2 B ON A.ID_No = B.ID_No WHERE B.Nom_Latin<>''

On aime bien de temps à autre répondre à des questions en SQL, mais je pense que www.developpez.net, forum SQL est quand même plus adapté à ta question puisqu’il contient pages de docs et d’aides(lis les docs et les autres questions posées avant de poser ta question).

Ps: Je ne pense pas que ça soit une bonne idée de mettre ton mail en signature.

SELECT * FROM Nom2 where ID_No in (SELECT ID_No FROM Descr2 WHERE Nom_Latin = '') SELECT 'UPDATE Descr2 SET Nom_Latin=\'', A.Nom_Latin, '\' WHERE ID_No=', ID_No FROM (select ID_No, Nom_Latin from Nom2 where ID_No in (select ID_No from Descr2 where Nom_Latin =''))

Trop de trucs imbriqués, mauvais choix de pseudo, demande contexte.

Bisous :kiss:

Ho tiens, je l’avais même pas vu le pseudo :smiley:

Sinon si tu veux faire un select+update atomique (qui lock le record quand tu le lis pour que tu sois le seul a le mettre a jour), tu veux un update lock ce qui en TSQL s’ecrit du genre:

BEGIN TRANSACTION
SET @machin = SELECT ProductId FROM Blah WITH(UPDLOCK) WHERE blablabla
UPDATE Product SET ProductName=newblabla WHERE ProductId=@machin
COMMIT TRAN

En oracle, j’en sais fouttre rien.