ограничение, выбор дубликатов проверяющих столбцов UNION - PullRequest
6 голосов
/ 25 января 2012

У меня есть две таблицы, подобные следующей:

parameters1

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

parameters2

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

Обычно я присоединяю результирующий набор этих двух таблиц к UNION следующим образом:

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

и я получаю этот набор результатов:

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

Я хочу ограничить проверку дубликатов UNION только столбцом cod, поэтому я хочу избежать дублирования 1 трески в наборе результатов (когда есть запись с другим именем и тем же треском ), я хочу получить имя из первой таблицы ( parameters1 ) :

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

UPDATE Если я удалю запись 1 из таблицы parameters1 (DELETE FROM parameters1 WHERE cod = 1), я должен получить такой набор результатов:

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

Можно ли ограничить проверку дубликатов UNION только одним полем или несколькими полями? Как?

Решение должно работать в среде с несколькими базами данных (MSSQL, PostgreSQL, MySQL).

Ответы [ 3 ]

9 голосов
/ 25 января 2012
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
)
2 голосов
/ 25 января 2012

Решение в по этой ссылке должно быть адаптировано к этим средам, так как это стандартный SQL (вы можете использовать ISNULL, если COALESCE недоступен).Я не уверен, что есть доступность FULL OUTER JOIN, но она должна быть доступна и на всех трех платформах.

В вашем случае решение будет выглядеть так:

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

... но ... MySQL, очевидно, не поддерживает FULL OUTER JOIN, поэтому в этом случае вы можете использовать другой прием:

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
0 голосов
/ 25 января 2012

Измените второй запрос на объединение, чтобы получить только параметры2, где параметры2.id отсутствует в параметрах 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...