2009-04-22 5 views
1

J'ai une base de données comme où:Puis-je avoir un SELECT interne à l'intérieur d'un SQL UPDATE?

Tableau foo a colonnes id et name Tableau bar a colonnes id et foo_id

J'ai une requête HTTP entrant avec un foo.name, je voudrais insérer une ligne en bar avec bar.foo_id réglé de manière appropriée. Ainsi, par exemple:

> SELECT * FROM foo; 
id  name 
------ ------- 
1  "Andrey" 
(1 row) 


> SELECT * FROM bar; 
(0 rows) 

Compte tenu "Andrey", est-il une seule requête que je peux exécuter pour obtenir:

> SELECT * FROM bar; 
id  foo_id 
------ ------- 
1  1 
(1 row) 

Je pensais le long des lignes de:

> UPDATE bar SET foo_id=(SELECT id FROM foo WHERE foo.name=?) 

Mais cette semble être faux, comme les ensembles de retour de SELECT, pas des valeurs ...

Répondre

4

vous auriez à faire

SELECT TOP 1 ID FROM foo where foo.name=? 

Mais à part cela, il n'y a rien de mal à faire un choix dans une mise à jour.

0

Cela fonctionnera au moins sur SQL Server et Oracle.

2

Cela fonctionne dans MS SQL Server, si la sous requête ne renvoie qu'une seule valeur (par exemple un MAX() ou TOP 1)

Je ne sais pas si cette fourche de syntaxe dans MySQL, mais vous pouvez essayer il ...

UPDATE 
    bar 
SET 
    bar.foo_id = foo.id 
FROM 
    bar 
INNER JOIN 
    foo 
    ON foor.name = bar.name 
ORDER BY 
    foo.id 

Dans ce cas, si la jointure renvoie plusieurs résultats par enregistrement dans la barre, tous seront appliqués. L'ordre en déterminant dans quel ordre ils sont appliqués, et le dernier étant péremptoire.

0

Essayez folowing

UPDATE bAR SET foo_id = F.id à partir de la barre join (SELECT id de foo où foo.name = @fooName) F