2009-09-02 5 views
2

Je veux créer une vue depuis les deux tableaux suivants:Voir Full OUTER JOIN

Entry: 
entry_id 
entry_date 
entry_amount 
user_id 

Forecast: 
forecast_id 
forecast_date 
forecast_amount 
user_id 

Maintenant, je veux avoir une vue qui combine chaque entrée avec ses prévisions (même user_id et même date). C'est bien, mais j'ai un problème avec ces lignes, qui ont une prévision et aucune entrée, ou vice versa.

J'aimerais toujours avoir toutes les entrées sans prévisions dans la base de données. Ils devraient apparaître avec des valeurs nulles dans les champs de prévision. Et la même chose pour les prévisions sans entrées.

+0

Oui, plein La jointure externe n'est pas supportée dans mysql jusqu'à la date de vérification de ma réponse. –

Répondre

2

Cette (FULL OUTER JOIN) commande est not available on MySql vous devez utiliser UNION pour atteindre cet objectif comme indiqué ci-dessous

SELECT E.*, F.* 
FROM Entry E 
LEFT JOIN Forecast F ON E.user_id = F.user_id AND E.entry_date = F.forecast_date 
UNION ALL 
SELECT E.*, F.* 
FROM Forecast F 
LEFT JOIN Entry E ON E.user_id = F.user_id AND E.entry_date = F.forecast_date 
+0

Merci - intéressant que mysql n'a pas FULL OUTER JOINs fonctionne très bien – Martin

+0

L'utilisation de l'union supprime les doublons. Il n'y en a peut-être pas dans ce cas, mais il n'y a rien dans la question qui exclue spécifiquement cela. La solution à cela est d'utiliser un syndicat à la place, voir ma réponse. – Guffa

+0

Oh oui, vous avez raison, l'a corrigé. –

0

Qu'avez-vous essayé?

Une jointure externe complète le ferait pour vous. Vous pouvez simuler avec deux jointures externes et une union tous:

select 
    e.entry_id, e.entry_date, e.entry_amount, e.user_id, 
    f.forecast_id, f.forecast_date, f.forecast_amount, f.user_id 
from 
    Entry e 
    left outer join Forecast f on f.user_id = e.user_id and f.forecast_date = e.entry_date 
union all 
select 
    e.entry_id, e.entry_date, e.entry_amount, e.user_id, 
    f.forecast_id, f.forecast_date, f.forecast_amount, f.user_id 
from 
    Entry e 
    right outer join Forecast f on f.user_id = e.user_id and f.forecast_date = e.entry_date 
where 
    e.entry_id is null 
+0

+1 Ajoutez simplement la comparaison de date –

+0

Je pense que cette commande n'est pas disponible dans mysql. –

+0

SELECT e.entry_id, \t e.user_id, \t e.entry__date, \t e.entry_amount, \t f.user_id, \t f.forecast_period_end, \t f.forecast_id, \t f.forecast_amount de l'entrée e FULL OUTER JOIN Prévision f ON e.user_id = f.user_id AND e.entry_date = f.forecast_period_end Donne-moi une erreur SQL. Je ne sais pas pourquoi ... – Martin