2009-10-12 9 views
0

update nom_table set (col1, col2, col3) = (choisir col1, col2, col3 de l'ordre tableName2 par tablenmae2.col4) Erreur retour manquant). La requête fonctionne correctement si je supprime la commande par la clauseErreur dans la requête

+0

Quelle est l'erreur? – blparker

Répondre

2

Donc, vous obtenez l'erreur "Missing" car l'analyseur s'attend à ce que la sous-requête se termine au point où vous avez ORDER BY.

+0

Oui, je sais que la clause order by n'est pas utilisée dans une requête de mise à jour, mais ici, j'utilise la clause ordrt by dans la requête select. –

0

Qu'est-ce que ORDER BY a l'intention de faire?

Ce que vous avez sans doute à l'esprit est quelque chose comme:

UPDATE TableName 
    SET (Col1, Col2, Col3) = (SELECT T2.Col1, T2.Col2, T2.Col3 
           FROM TableName2 AS T2 
           WHERE TableName.Col4 = T2.Col4 
          ) 
WHERE EXISTS(SELECT * FROM TableName2 AS T2 WHERE TableName.Col4 = T2.Col4); 

Cette opération maladroite recherche:

  1. Grabs lignes de TableName2 qui correspondent à TableName sur la valeur Col4 et met à jour TableName avec les valeurs des colonnes correspondantes.
  2. Garantit que seules les lignes de TableName avec une ligne correspondante dans TableName2 sont modifiées; Si vous supprimez la clause WHERE à partir de UPDATE, vous remplacez les valeurs dans Col1, Col2 et Col3 par des valeurs null s'il existe des lignes dans TableName sans une entrée correspondante dans TableName2.

Certains SGBD prennent également en charge une notation de jointure de mise à jour pour réduire la gravité de cette notation. ORDER BY n'est pas autorisé dans une sous-requête dans un UPDATE.

Questions connexes