3
votes

Pourquoi ma requête de mise à jour ne se met-elle pas à jour?

J'ai essayé une requête de mise à jour avec des informations d'une autre table mais d'une manière ou d'une autre ne fonctionne pas et je n'arrive pas à comprendre pourquoi c'est

voici comment je fais la requête:

  sheet_expedient|report_date|name_expedient_owner|address_expedient|
  1              | 01-01-2011|mike                | his house 123   |
  2              | 06-06-2006|josh                | their house 456 |
  3              | 07-07-2007|andrew              | his place 789   |
  4              | 08-08-2008|frank               | somewhere 1111  |
  5              | 09-09-2009|chad                | anywhere 2222   |
  6              | 10-10-2010|zack                | nowhere 3333    |
  7              | 11-11-2011|steve               | everywhere 4444 |
  8              | 12-12-2012|mark                | here      5555  |

pourquoi cela ne fonctionne pas? merci d'avance.

MODIFIER

je vois des gens un peu confus au sujet de la structure du tableau, la voici

dbo_expedient_reports

report_id|sheet_expedient|report_number|report_date|notificacion_date|report_status|
1        | NULL          | NULL        | NULL      | NULL            | NULL        |
2        | NULL          | NULL        | NULL      | NULL            | NULL        |
3        | NULL          | NULL        | NULL      | NULL            | NULL        |
4        | NULL          | NULL        | NULL      | NULL            | NULL        |
5        | NULL          | NULL        | NULL      | NULL            | NULL        |
6        | NULL          | NULL        | NULL      | NULL            | NULL        |
7        | NULL          | NULL        | NULL      | NULL            | NULL        | 
8        | NULL          | NULL        | NULL      | NULL            | NULL        |

db_data (celui-ci contient les informations que je veux mettre sur dbo_expedient_reports)

UPDATE x
SET x.sheet_expedient=db_data.sheet_expedient 
FROM dbo_expedient_reports x
INNER JOIN  db_data ON x.sheet_expedient= db_data.sheet_expedient
WHERE x.sheet_expedient IS NULL

L'idée principale est que les informations de la feuille expédient vont aux rapports dbo_expedient pour une instance et les autres lignes de db_data vont dans une autre table où les informations seront placées, vous pouvez penser, la feuille expédient est la même que l'id, eh bien ce n'est pas le cas depuis le sheet_expedient atteint une limite (environ 800) puis recommence, donc c'est différent de l'id, tandis que le sheet_expedient atteindra le numéro 800 puis recommencera donc l'id sera l'id 800 sheet_expedient 800 puis l'id 801 sheet_expedient 1 p >

J'espère que quelques doutes ont été clarifiés pour une meilleure compréhension, merci pour toutes les réponses


6 commentaires

pourquoi cela ne fonctionne pas? ... Qu'est-ce qui ne fonctionne pas exactement?


salut - B001 ᛦ - en fait, il ne fait rien, le résultat que j'ai obtenu indique 0 lignes renvoyées, ce qui signifie que rien n'a été modifié


La requête fonctionne. S'il ne fait pas ce que vous attendez, il y a un malentendu dans vos attentes. Montrez-nous un exemple de données source et ce que vous attendez des données après l'exécution de la requête, et nous pourrons vous expliquer pourquoi il ne fait pas ce que vous attendez.


Cela ne changera jamais les valeurs de x.sheet_expedient à cause de INNER JOIN. Le seul moment où il correspondra, à cause de votre clause WHERE, est lorsque sheet_expedient est NULL dans vos deux tables. Sans la clause WHERE, toutes les valeurs de sheet_expedient dans les deux tables correspondront toujours en raison de INNER JOIN et aucune mise à jour ne se produira. Je soupçonne que vous devez JOIN sur d'autres colonnes, mais je ne peux pas vraiment dire quoi sans voir vos structures de table et vos exemples de données.


Vous devez publier des exemples de données de la table et du résultat attendu après la mise à jour.


Après avoir vu vos données, je dirais que vous devez vous inscrire sur x.report_id = db_data.sheet_expedient . Vous ne pouvez pas rejoindre x.sheet_expedient car il est nul.


4 Réponses :


0
votes

Vous pensez avoir besoin d'une jointure gauche:

UPDATE x
SET x.sheet_expedient=db_data.sheet_expedient 
FROM dbo_expedient_reports x
LEFT JOIN  db_data ON x.sheet_expedient= db_data.sheet_expedient
WHERE x.sheet_expedient IS NULL


6 commentaires

Cela ne changerait rien puisqu'il s'agit d'une UPDATE .


salut scsimon - voulez-vous dire que j'ai besoin de faire une insertion? la table appelée dbo_expedient_reports n'a qu'une colonne remplie qui a les identifiants mais le reste est vide, ce que j'ai essentiellement essayé de faire est de ne remplir qu'une seule colonne, j'ai essayé avec un insert mais cela génère une erreur selon laquelle je dois passer une valeur à cela colonne id, que puis-je faire dans ce cas? - Merci pour votre réponse


@ сꝛıϻѕοɴᴠᴇɴoϻ pour informer les membres SO des nouveaux commentaires, utilisez "@" avant leur nom


salut SQL_M - j'ai essayé votre requête, cela fonctionne, mais cela ne se met pas à jour, je veux dire, la ligne reste nulle


@ B001 ᛦ merci pour les conseils, mon mauvais sur le marquage, je suis nouveau ici (peut-être moins de 2 semaines)


pas de problème, je voulais juste rendre votre vie SO-vie un peu plus facile :) @ сꝛıϻsoϻoϻ



1
votes

Je ne sais pas trop ce que vous aimeriez accomplir. Si x.sheet_expedient est censé être NULL, pourquoi l'avez-vous utilisé dans la jointure? Avez-vous d'autres champs que vous pouvez utiliser pour joindre les deux tables?


0 commentaires

0
votes

Pour vérifier, essayez ceci:

WITH cte AS
    (SELECT         x.sheet_expedient       [FieldToUpdate]
     ,              db_data.sheet_expedient [NewValue]
     ,              *
       FROM         dbo_expedient_reports x
      INNER JOIN    db_data ON x.sheet_expedient = db_data.sheet_expedient
      WHERE         x.sheet_expedient IS NULL)
--UPDATE  cte    SET  [FieldToUpdate] = [NewValue];
SELECT  *   FROM  cte;

J'emballe généralement mes mises à jour dans un cte avant de les exécuter. Me permet de voir les valeurs avant et les valeurs après. Bien que cela ne réponde pas à votre question, cela devrait vous aider à identifier pourquoi.

J'ai commenté la déclaration de mise à jour, une fois que la sélection renvoie les lignes et les valeurs que vous attendez, supprimez le commentaire de la mise à jour et commentez sur la sélection.


2 commentaires

J'ai essayé votre code et il affiche une erreur, dit "sheet_expedient" a été spécifié plusieurs fois


Essayez de développer le *, puis supprimez le nom de colonne en double.



3
votes

D'après votre commentaire, vous avez JOIN sur la mauvaise colonne. Voici le correctif.

UPDATE x
SET x.sheet_expedient=db_data.sheet_expedient 
FROM dbo_expedient_reports x
INNER JOIN  db_data ON x.report_id = db_data.sheet_expedient --here is the change
WHERE x.sheet_expedient IS NULL

Remarque, tout ce que cela va faire est de dupliquer la colonne report_id . Autrement dit, la colonne report_id correspondra à la colonne sheet_expedient de votre table dbo_expedient_reports . Je ne sais pas à quoi ça sert.

De plus, la clause WHERE n'est pas nécessaire sur la base de cet exemple de données.


5 commentaires

J'ai une question, si je veux mettre à jour une autre colonne liée aux tableaux que j'ai mis sur l'exemple, que dois-je changer?


vous l'ajouteriez simplement au set . Donc ... SET x.sheet_expedient = db_data.sheet_expedient, x.anotherColumn = db_data.anotherColumn


oui, vous avez raison, mais par exemple j'ai une colonne avec un plus grand nombre de données (environ 1650 lignes) et j'insère juste 800, pourquoi cela se produit-il?


Parce que votre clause JOIN et WHERE limite les lignes. C'est une logique SQL très basique


comment puis-je résoudre ce problème?