UNION ist ja nicht in der Lage, die Tabellen logisch zu verknüpfen und wäre hier eigentlich nicht dienlich. Mein erster Gedanke wäre die Tabelle B an Tabelle A LEFT JOINen und dann mittels COALESCE erst die Einträge aus B und wenn diese NULL sind eben die aus A zu nehmen. Kann später, wenn ich am PC bin mal ein Beispiel schreiben.
/edit:
So in etwa machen wir das auf der Arbeit, wenn wir potentiell invalide Dimensionen ranmatchen und im Falle einer fehlenden Referenz den Ursprungswert beibehalten wollen.
SQL
SELECT tabA.id, COALESCE(tabB.farbe, tabA.farbe), COALESCE(tabB.preis, tabA.preis)
FROM tabA
LEFT JOIN tabB ON tabB.user = 'test' AND tabB.id = tabA.id
Wir haben auf der Arbeit nur Microsoft SQL, sollte aber auch in MySQL funktionieren. Dadurch, dass du im Endeffekt nur den einen Join hast, bist du so performant unterwegs, wie es geht.