2016-03-01 2 views
0

Existe-t-il des raisons pour lesquelles les UNION ne doivent pas être utilisés dans la clause WHERE des sous-requêtes de mise à jour? Ou d'ailleurs, même sélectionner des sous-requêtes normales?UNION dans la clause WHERE de la sous-requête de mise à jour

Existe-t-il un meilleur moyen de supprimer une telle requête? Notez que pour mon cas, l'UNION se traduira par un nombre d'enregistrements assez faible.

UPDATE mytable 
set mytable.bla='xxx' 
WHERE id IN (
    SELECT id 
    FROM t1 
    INNER JOIN t2 ON t2.t1_id=t1.id 
    LEFT OUTER JOIN t3 ON t3.t1_id=t2.id 
    WHERE t2.id IN (1,2,3) AND t3.id IS NULL 
    UNION 
    SELECT id FROM t4 
    INNER JOIN t5 ON t5.id=t4.t5_id 
    LEFT OUTER JOIN t6 ON t6.t5_id=t5.id 
    WHERE t5.parent_id IN (1,2,3) AND t6.id IS NULL 
); 
+0

UNION ALL peut-être? – jarlh

+1

Un problème est que la sous-requête ne peut renvoyer qu'une seule valeur lors de l'utilisation d'égales - peut-être que vous voulez dire "in". Si cette requête devait aboutir à plusieurs enregistrements, elle serait erronée ... BTW - Je ne crois pas que cette requête soit corrélée puisqu'elle ne fait pas référence à 'mytable'. – sgeddes

+0

@sgeddes Oui, après avoir vu votre commentaire, je suis d'accord qu'il n'est probablement pas corrélé en raison de votre raison donnée. Mais, reste à savoir si je devrais ou ne devrais pas mettre une requête dans la clause WHERE. Je pensais que quand on le fait, on ne devrait pas utiliser 'IN', mais' = 'comme je l'ai montré. Peut être pas? – user1032531

Répondre

1

commutation à une jointure: -

UPDATE mytable 
INNER JOIN 
(
    SELECT id 
    FROM t1 
    INNER JOIN t2 ON t2.t1_id=t1.id 
    LEFT OUTER JOIN t3 ON t3.t1_id=t2.id 
    WHERE t2.id IN (1,2,3) 
    AND t3.id IS NULL 
    UNION 
    SELECT id 
    FROM t4 
    INNER JOIN t5 ON t5.id=t4.t5_id 
    LEFT OUTER JOIN t6 ON t6.t5_id=t5.id 
    WHERE t5.parent_id IN (1,2,3) 
    AND t6.id IS NULL 
) sub0 
ON mytable.id = sub0.id 
SET mytable.bla='xxx' 
+0

Bon, je peux le faire. Mais pourquoi est-ce mieux? Merci – user1032531

+0

Selon la version de MySQL, IN (sous-requête) est très lent. Comme votre sous-requête renvoie éventuellement plusieurs lignes, vous ne pouvez pas simplement utiliser = pour vérifier une valeur. – Kickstart

+0

Cela me semble bon. Va lui donner un peu plus de temps, et sélectionnez ceci comme la meilleure réponse. Merci pour l'aide. – user1032531