2011-02-10 4 views
0

J'ai deux tables (Master, réponses)Aide mise à jour SQL

Je dois utiliser le champ master_id de la table réponses, pour le rechercher dans le tableau principal (id) pour l'enregistrement correspondant et mettre à jour un champ de date la table principale avec un champ de date dans le tableau Réponses

Maître tableau de liens sur le terrain Id pour rEPONSES champ master_id de la table

cela peut-il être fait dans SQL ????

UPDATE Master m SET m.date = (
    SELECT r.date FROM Reponses r WHERE r.master_id = m.id) 
WHERE m.id IN (SELECT master_id FROM Responses) 

Je reçois un - Erreur SQL générale - Plusieurs lignes dans la sélection singleton.

Ai-je besoin d'ajouter une jointure ou de changer quelque chose?

Répondre

3

L'erreur signifie qu'il ya des cas où un enregistrement maître particulier, ont plus d'une réponse, la sous-requête pour obtenir la date retourne plus d'une ligne. Comme vous le savez peut-être, le serveur n'a pas la logique de choisir la bonne réponse et de mettre à jour la table principale (les dates peuvent être différentes ou non, qui sait), alors le message d'erreur s'affiche.

Ce que vous devez faire est de vous assurer que la sous-requête ne renvoie qu'une seule ligne: la ligne exacte dont vous avez besoin pour choisir la date de réponse sur la table principale. Si toutes les lignes de réponses contiennent la même date, vous pouvez utiliser la clause FIRST pour renvoyer uniquement la première ligne, comme suggéré par @cyberkiwi.

Mais vous pouvez choisir le plus récent, le plus ancien ou tout autre basée sur un critère:

Tout cela supprimera le message d'erreur, le bon ne peut être semée, selon vos besoins:

UPDATE Master m SET m.date = (
    SELECT FIRST 1 r.date FROM Reponses r WHERE r.master_id = m.id) 
WHERE m.id IN (SELECT master_id FROM Responses) 

UPDATE Master m SET m.date = (
    SELECT MAX(r.date) FROM Reponses r WHERE r.master_id = m.id) 
WHERE m.id IN (SELECT master_id FROM Responses) 

UPDATE Master m SET m.date = (
    SELECT MIN(r.date) FROM Reponses r WHERE r.master_id = m.id) 
WHERE m.id IN (SELECT master_id FROM Responses) 

UPDATE Master m SET m.date = (
    SELECT r.date FROM Reponses r WHERE r.master_id = m.id AND r.accepted = 1) 
WHERE m.id IN (SELECT master_id FROM Responses) 
1

Vous pouvez d'abord essayer

UPDATE Master m SET m.date = (
    SELECT FIRST 1 r.date FROM Responses r WHERE r.master_id = m.id) 
WHERE m.id IN (SELECT master_id FROM Responses) 
+0

PREMIÈRE? Vous ne savez pas comment cela est censé m'aider à mettre à jour tous les enregistrements de date fied dans la table principale en utilisant le champ de date dans la table des réponses où l'ID correspond ????????? – IElite

+1

@Shane Pour chaque master_id des réponses - recherchez l'enregistrement dans Master. En utilisant cet enregistrement dans Master (il n'y en a qu'un par m.id), mettez-le à jour à la date de la première réponse). Votre erreur est due au fait que vous avez plusieurs réponses par maître, vous NE POUVEZ PAS mettre à jour de façon permanente la fiche "1" avec des dates "X". C'est ce que FIRST est pour. – RichardTheKiwi