Question

J'ai deux tables avec les mêmes colonnes

tbl_source (ID, Title)

tbl_dest (ID, Title)

Je souhaite mettre à jour les titres tbl_dest à partir de tbl_source où les identifiants de dest et source correspondent. Cependant, je ne souhaite pas mettre à jour le titre de destination si le titre source est null (ou vide).

J'ai ceci:

UPDATE    tbl_dest
SET              tbl_dest.Title =
      (SELECT     title
        FROM          tbl_source
        WHERE      tbl_dest.id = tbl_source.ID and tbl_source.title is not null)

Mais il continue d'insérer les NULL.

Comment pourrais-je construire une telle requête?

J'utilise SQL Server 2005.

Merci.

Était-ce utile?

La solution

Utiliser une jointure interne ...

Update tbl_dest
Set tbl_dest.Title = tbl_source.Title
From tbl_dest inner join tbl_source on tbl_dest.ID = tbl_source.ID
Where tbl_source.Title is not null and tbl_source.Title <> ''

Autres conseils

La valeur null a été définie car la sous-requête renvoie la valeur null et vous ne filtrez pas les enregistrements dans votre clause de mise à jour.

Essayez quelque chose comme ceci à la place:

UPDATE tbl_dest
SET tbl_dest.Title = 
    (SELECT title
    FROM tbl_source
    WHERE tbl_source.id = tbl_dest.id)
WHERE EXISTS
    (SELECT 1
    FROM tbl_source
    WHERE tbl_source.id = tbl_dest.id
    AND tbl_source.title IS NOT NULL)

En effet, la requête externe met à jour tous les enregistrements (pas de clause WHERE). Ainsi, lorsque la requête interne ne trouve aucun enregistrement correspondant, NULL est inséré.

Ajoutez une clause WHERE à la requête externe pour ne pas mettre à jour ces enregistrements:

UPDATE    tbl_dest
SET              tbl_dest.Title =
      (SELECT     title
        FROM          tbl_source
        WHERE      tbl_dest.id = tbl_source.ID and tbl_source.title is not null)
WHERE EXISTS
      (SELECT     title
        FROM          tbl_source
        WHERE      tbl_dest.id = tbl_source.ID and tbl_source.title is not null)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top