Begrenzung, Wahl der UNION doppelte Prüfspalten

Ich habe zwei Tische wie die folgenden:

Parameter1

+------+-----+ | cod | des | +------+-----+ | 1 | aaa | | 2 | bbb | | 3 | ccc | 

parameter2

 +------+-----+ | cod | des | +------+-----+ | 1 | mmm | 

Ich gebe normalerweise den Ergebnis dieser beiden Tische mit einer UNION auf diese Weise:

 SELECT cod, des FROM parameters1 UNION SELECT cod, des FROM parameters2 

und ich bekomme diese Ergebnismenge:

 +------+-----+ | cod | des | +------+-----+ | 1 | aaa | | 2 | bbb | | 3 | ccc | | 1 | mmm | 

Ich möchte die UNION doppelte Überprüfung nur auf die cod Spalte zu begrenzen, so möchte ich vermeiden, dass die 1 cod in der Ergebnismenge dupliziert werden (wenn es einen datasatz mit verschiedenen Namen und den gleichen Kabeljau), ich möchte den Namen zu bekommen aus der ersten Tabelle ( Parameter1 ) :

 +------+-----+ | cod | des | +------+-----+ | 1 | aaa | | 2 | bbb | | 3 | ccc | 

UPDATE Wenn ich den datasatz 1 aus der Parameter11 entfernen ( DELETE FROM parameters1 WHERE cod = 1 ) sollte ich diese Ergebnismenge erhalten:

 +------+-----+ | cod | des | +------+-----+ | 1 | mmm | ---> FROM parameters2 | 2 | bbb | | 3 | ccc | 

Ist es möglich, die doppelte Überprüfung einer UNION auf nur ein Feld oder einige Felder zu begrenzen? Wie ?

Die Lösung sollte auf einer Multidatabase-Umgebung (MSSQL, PostgreSQL, MySQL) arbeiten.

 SELECT cod, des FROM parameters1 p1 UNION ALL SELECT cod, des FROM parameters2 p2 WHERE NOT EXISTS ( SELECT 1 FROM parameters1 p1sub WHERE p1sub.cod = p2.cod ) 

Die Lösung in diesem Link sollte an diese Umgebungen angepasst werden, da es Standard-SQL ist (Sie können ISNULL wenn COALESCE nicht verfügbar ist). Ich bin mir nicht sicher, wie die Verfügbarkeit von FULL OUTER JOIN ist, aber es sollte auch auf allen drei Plattformen verfügbar sein.

In Ihrem Fall wird die Lösung am Ende aussehen wie:

 SELECT p1.cod, ISNULL(p1.des, p2.des) AS des FROM parameters1 p1 FULL OUTER JOIN parameters2 p2 ON p1.cod = p2.cod 

… aber … MySQL scheinbar nicht unterstützt FULL OUTER JOIN , so können Sie einen anderen Trick in diesem Fall verwenden:

 SELECT p1.cod, ISNULL(p1.des, p2.des) AS des FROM parameters1 p1 LEFT JOIN parameters2 p2 ON p1.cod = p2.cod UNION ALL SELECT p2.cod, p2.des FROM parameters2 p2 LEFT JOIN parameters1 p1 ON p1.cod = p2.cod WHERE p1.cod IS NULL 

Ändern Sie die zweite Gewerkschaftsabfrage, um nur Parameter2 zu erhalten, wobei parameter2.id nicht in parametern1 ist.