12
votes

En utilisant un seul commun où condition pour l'union dans SQL

J'essaie de faire quelque chose comme ceci:

SELECT a.date AS EnrollDate, a.id, a.name, b.address FROM student a JOIN Location b ON a.id=b.id  
UNION  
SELECT a.date AS EnrollDate, a.id, a.name, b.address FROM teacher a JOIN Location b ON a.id=b.id  
WHERE a.date>'2010-01-01'  
ORDER BY EnrollDate


1 commentaires

accepter les ANS si cela fonctionne pour vous


3 Réponses :


-2
votes

Il n'y en a aucun moyen, vous devez répéter le lieu où chaque clause de sélection individuelle.


2 commentaires

Ok, en regardant les autres réponses, ma réponse est fausse car elle indique qu'il n'y en a aucun moyen. Cependant, d'un point de vue de la performance, je supposerais toutes les solutions de la première syndicalisation, puis en évaluant la situation où l'état sera probablement pire (si vous n'avez pas d'optimiseur vraiment intelligent, que je ne supposerais pas pour MySQL).


Appliquer le lieu de chaque partie individuellement est seulement meilleur s'il y a un index disponible pour qu'il soit utilisé. Notez également que l'union est plus lente que l'union tout, car elle a une étape supplémentaire d'éliminer les doublons.



5
votes

Avez-vous essayé quelque chose comme:

SELECT * FROM 
(
    SELECT a.date AS EnrollDate, a.id, a.name, b.address FROM student a JOIN Location b ON a.id=b.id  
    UNION  
    SELECT a.date AS EnrollDate, a.id, a.name, b.address FROM teacher a JOIN Location b ON a.id=b.id 
) A
    WHERE a.date>'2010-01-01'  
    ORDER BY EnrollDate


1 commentaires

Vous devez soit donner à la sous-requête un alias, soit remplacer «A.Date» avec simplement «date».



16
votes
SELECT * FROM (
  SELECT a.date AS EnrollDate, a.id, a.name, b.address FROM student a JOIN Location b ON a.id=b.id  
  UNION  
  SELECT a.date AS EnrollDate, a.id, a.name, b.address FROM teacher a JOIN Location b ON a.id=b.id  
) A
WHERE EnrollDate > '2010-01-01'  
ORDER BY EnrollDate
This also has the advantage, compared to individual ORDER BY's that the whole result is correctly ordered.

3 commentaires

En passant, la clause d'où devrait s'inscrire à l'instruction au lieu d'une comparaison;)


Notez que cela (au moins dans mon cas) ne spécifie pas les conditions sur les tableaux séparément, elle effectue la requête sur l'ensemble du jeu de résultats, considérant ainsi des lignes qui sont ensuite jetées. Dans mon cas (Total des rangées de 10 m), il n'est pas une solution pour l'utiliser de cette façon ...


Une base de données décente doit appuyer sur la condition Instroldate et ne pas générer un énorme ensemble de résultats intermédiaire. Mais vous pouvez bien sûr ajouter manuellement l'endroit où sélectionnez et laissez simplement la commande par pour garder tout le résultat commandé.