2017-08-28 25 views
-2

J'ai 2 tables identiques dates et DATES_ARCHIVEDMYSQL insérer dans + select + CASE + SUPPR ne fonctionne pas

Je veux sélectionner dans le tableau DATES toutes les lignes qui ont des dates plus anciennes que la date actuelle -88 jours, puis insérez ces lignes dans DATES_ARCHIVED.

J'ai créé un CAS pour cela.

Ensuite, après l'insertion, je veux supprimer ces mêmes lignes de la table DATES d'origine.

Je suis certain que je suis arrivé que cela fonctionne avant, mais il ne fonctionne plus, il continue à donner erreur:

Code d'erreur: 1136. Nombre de colonnes ne correspond pas au nombre de valeurs à la ligne 1

tous les Les tables ont la même quantité de colonnes et j'ai également enlevé les 2 déclencheurs que j'avais sur les tables mais la même erreur se produit.

Je suis assez sûr que c'est à cause du cas où il se termine comme MostRecentDate, je pense que cela ajoute une nouvelle colonne.

Aussi, si je supprime tout le code ci-dessous la première: de dates, je reçois la même erreur

Voici le code:

INSERT INTO dates_archived 

(term, course_no, date1_end, date2_end, date3_end, date4_end) 

SELECT 

term, course_no, date1_end, date2_end, date3_end, date4_end, 

    CASE WHEN date1_end > date2_end THEN date1_end 
      WHEN date2_end > date1_end THEN date2_end 
      WHEN date3_end > date1_end THEN date3_end 
      WHEN date4_end > date1_end THEN date4_end 

      WHEN date1_end > date3_end THEN date1_end 
      WHEN date2_end > date3_end THEN date2_end 
      WHEN date3_end > date2_end THEN date3_end 
      WHEN date4_end > date2_end THEN date4_end 

      WHEN date1_end > date4_end THEN date1_end 
      WHEN date2_end > date4_end THEN date2_end 
      WHEN date3_end > date4_end THEN date3_end 
      WHEN date4_end > date3_end THEN date4_end 

    ELSE 0 

    END AS MostRecentDate 

FROM dates 

HAVING (MostRecentDate <= (SELECT CURDATE() - INTERVAL 88 DAY)); 

FROM dates 

WHERE (date1_end OR date2_end OR date3_end OR date4_end = MostRecentDate); 

DELETE FROM dates 

WHERE (date1_end OR date2_end OR date3_end OR date4_end = MostRecentDate); 

Merci à l'avance, Chris

+1

Vous sélectionnez 7 colonnes et les insérez dans 6 colonnes – Jens

+0

Vous ne pouvez pas non plus utiliser un alias défini dans la clause select de la clause where. – fancyPants

+0

Et comment votre instruction delete devrait-elle être au courant de MostRecentDate? – fancyPants

Répondre

0

Avec votre CASE vous y mettez une nouvelle ligne appelée MostRecentDate, donc le nombre de lignes ne correspond pas au nombre de lignes de la table (puisque vous n'utilisez que ces term, course_no, date1_end, date2_end, date3_end, date4_end dans l'insertion).

Si vous avez vraiment besoin de ce champ MostRecentDate, vous devrez l'ajouter dans la table DATES_ARCHIVED pour que le nombre de lignes soit le même et que vos instructions fonctionnent parfaitement.

Si vous n'avez pas besoin que cette ligne soit insérée dans la table, supprimez simplement l'instruction CASE du code et cela devrait fonctionner sans vous donner d'erreur.

Toujours dans votre code, vous utilisez MostRecentDate dans l'instruction DELETE, mais cette variable doit être supprimée une fois que l'insertion dans l'instruction est terminée, afin que le code y casse. Si vous voulez l'utiliser dans l'instruction delete, vous devez également le déclarer à nouveau.

Je vous suggère de faire une variable et faire la déclaration CASE pour enregistrer la valeur à l'intérieur et il suffit d'utiliser cette variable dans votre HAVING/WHERE et DELETE, de sorte que façon, vous ne devez avoir dans le SELECT et le code ne se cassera pas là non plus.

+0

Oui, j'ai également ajouté MostRecentDate dans dates_archived et il ajoute les lignes mais ne les supprimera pas des dates. Je vais répondre aux commentaires ci-dessus pour la partie supprimer. – PAPADOC

+0

Je viens d'éditer la réponse pour supprimer aussi. J'espère avoir réussi à vous aider, passez une bonne journée monsieur. – MirzaS

+0

Je vais vérifier merci – PAPADOC