0
votes

Mettre à jour plusieurs enregistrements en fonction de l'enregistrement de 1 critère

J'essaie de sélectionner tous les enregistrements d'un jeu de données où 1 des enregistrements répond à un critère. J'ai une table de données contenant les heures travaillées par une personne de jour. J'ai besoin de sélectionner tous les enregistrements d'une personne pour cette semaine, si un enregistrement de cette semaine a le drapeau "enregistré" défini sur "N". Voici un exemple de données:

T_HOURS: P>

SELECT * FROM t_hours
WHERE (Name = (SELECT t1.Name FROM t_hours t1 
               where t1.Name = t2.Name and t1.Week = t2.Week and 
               t1.Logged = 'N') and
       Week = (SELECT t2.Week FROM t_hours t2 
               where t1.Name = t2.Name and t1.Week = t2.Week and 
               t2.Logged = 'N')


0 commentaires

4 Réponses :


0
votes

Essayez comme ci-dessous en utilisant Exists xxx


0 commentaires

0
votes

Est-ce ce que tu veux? xxx


5 commentaires

Merci pour votre commentaire, mais je ne pense pas que cela soit acceptable dans SQL Server. La clause WHERE de "Nom, Workweek" ne fonctionne pas. Est-ce que je manque quelque chose?


Quelle est l'erreur que vous avez? Si cela ne fonctionne pas, il existe une utilisation


Une expression de type non booléen spécifié dans un contexte où une condition est attendue, près de ','


Il existe de bons résultats retournés, mais encore une fois, merci pour votre aide!


Non, en utilisant deux champs avec un opérateur dans une clause où la clause ne fonctionne pas. Mais utiliser existe existe du travail.



0
votes

Données de retour:

 UPDATE t_hours
SET    logged = 'N'
WHERE  EXISTS (SELECT 1
               FROM   t_hours t2
               WHERE  t1.NAME = t2.NAME
                      AND t1.week = t2.week
                      AND t2.logged = 'N');  


1 commentaires

Merci! Cela fonctionne pour ce dont j'avais besoin! Gentil et propre, marquage comme répondu



1
votes

Vous pouvez utiliser une UPDABLE CTE:

with toupdate as (
      select t.*,
             min(logged) over (partition by name, week) as min_logged
      from t
     )
update toupdate
    set logged = min_logged
    where min_logged = 'N' and min_logged <> logged;


2 commentaires

C'est une réponse vraiment propre, Gordon. Est-ce que min_loggeggeggeging ne fonctionne que parce qu'il y a deux options, par exemple N / y, ou fonctionnerait-il toujours s'il y avait des valeurs supplémentaires? Je suppose que cela ne fonctionne que si les valeurs sont en ordre croissant / décroissant, respectivement.


@Sanbrookins. . . min () est une commodité dans ce cas car elle prend deux valeurs. Une légère variation peut être utilisée s'il y a plus de valeurs, en fonction des circonstances.