Исключить результаты из объединения, где встречаются повторяющиеся ключи - PullRequest
0 голосов
/ 19 октября 2010

Я работаю с данными из разных источников, которые я не могу контролировать.Эти источники имеют тенденцию иметь дубликаты в «ключевых» значениях.Мне нужно, чтобы любое из этих повторяющихся значений соответствовало форме в объединении.

Используя следующие данные

T1
| ID | FirstKey | SecondKey | ThirdKey | AdditionalColumns   |
+----+----------+-----------+----------+---------------------+
| 01 | Prod1    | ABC1      | 201      | Jun 2010, A, 101    |
| 02 | Prod2    | DEF2      | 202      | May 2009, A, 101    |
| 03 | Prod2    | DEF2      | 202      | May 2010, S, 101    |
| 04 | Prod3    |           | 206      | Jun 2010, A, 103    |
| 05 | Prod4    |           | 207      | Jun 2011, S, 103    |


T2
| ID | FirstKey | SecondKey | ThirdKey | AdditionalColumns   |
+----+----------+-----------+----------+---------------------+
| 01 | Prod1    | ABC1      | 201      | Jun 2010, A, 101    |
| 02 | Prod2    | DEF2      |          | May 2009, A, 101    |
| 03 | Prod2    | DEF2      | 202      | May 2010, S, 101    |
| 04 | Prod3    |           |          | Jun 2010, A, 103    |
| 05 | Prod4    |           | 207      | Jun 2011, S, 103    |
| 06 | Prod1    | ABC1      | 201      | Jun 2010, T, 101    |

Теперь, если мы выполним запрос:

SELECT 
       T1.FirstKey, T1.SecondKey, T1.ThirdKey,
       T2.FirstKey, T2.SecondKey, T2.ThirdKey,
       T1.AdditionalColumns, T2.AdditionalColumns
FROM 
       T1 JOIN T2 ON T1.FirstKey = T2.FirstKey 
          AND T1.SecondKey = T2.SecondKey
          AND T1.SecondKey IS NOT NULL
UNION
SELECT 
       T1.FirstKey, T1.SecondKey, T1.ThirdKey,
       T2.FirstKey, T2.SecondKey, T2.ThirdKey, 
       T1.AdditionalColumns, T2.AdditionalColumns
FROM 
       T1 JOIN T2 ON T1.FirstKey = T2.FirstKey 
          AND T1.ThirdKey = T2.ThirdKey
          AND T1.SecondKey IS NULL

Мы получаем следующие результаты

FirstKey  SecondKey  ThirdKey  FirstKey  SecondKey  ThirdKey  AdditionalColumns  AdditionalColumns
--------  ---------  --------  --------  ---------  --------  -----------------  -----------------
Prod1     ABC1       201       Prod1     ABC1       201       Jun 2010, A, 101   Jun 2010, A, 101
Prod1     ABC1       201       Prod1     ABC1       201       Jun 2010, A, 101   Jun 2010, T, 101
Prod2     DEF2       202       Prod2     DEF2       202       May 2009, A, 101   May 2010, S, 101
Prod2     DEF2       202       Prod2     DEF2       202       May 2010, S, 101   May 2010, S, 101
Prod4     NULL       207       Prod4     NULL       207       Jun 2011, S, 103   Jun 2011, A, 103

Мне нужен запрос, чтобы возвращать только записи с достоверным соответствием.Например, только 1 совпадение между таблицами.

FirstKey  SecondKey  ThirdKey  FirstKey  SecondKey  ThirdKey  AdditionalColumns  AdditionalColumns
--------  ---------  --------  --------  ---------  --------  -----------------  -----------------
Prod4     NULL       207       Prod4     NULL       207       Jun 2011, S, 103   Jun 2011, A, 103

Есть ли способ сделать это в JOIN?

В настоящее время я могу получить уникальные значения, создав CTE для каждой таблицы, которая гарантирует уникальность включи, используемые в соединении.Это работает, но уродливо и добавляет значительную работу к запросу.

Есть ли другой способ сделать это объединение, которое исключит повторяющиеся совпадения?Это предполагает, что я не могу программно исключить ни одну из повторяющихся строк на основе данных AdditionalColumns.

Я сталкиваюсь с этим снова и снова, так что метод CTE кажется просто грязным, так как это должно быть решенной проблемой.

Ответы [ 2 ]

1 голос
/ 19 октября 2010

Как насчет использования GROUP BY вокруг вашего запроса:

SELECT T1.FirstKey, T1.SecondKey, T1.ThirdKey, T2.FirstKey, T2.SecondKey, T2.ThirdKey, T1.AdditionalColumns, T2.AdditionalColumns, COUNT(*)
FROM (
SELECT 
       T1.FirstKey, T1.SecondKey, T1.ThirdKey,
       T2.FirstKey, T2.SecondKey, T2.ThirdKey,
       T1.AdditionalColumns, T2.AdditionalColumns
FROM 
       T1 JOIN T2 ON T1.FirstKey = T2.FirstKey 
          AND T1.SecondKey = T2.SecondKey
          AND T1.SecondKey IS NOT NULL
UNION
SELECT 
       T1.FirstKey, T1.SecondKey, T1.ThirdKey,
       T2.FirstKey, T2.SecondKey, T2.ThirdKey, 
       T1.AdditionalColumns, T2.AdditionalColumns
FROM 
       T1 JOIN T2 ON T1.FirstKey = T2.FirstKey 
          AND T1.ThirdKey = T2.ThirdKey
          AND T1.SecondKey IS NULL
)
GROUP BY T1.FirstKey, T1.SecondKey, T1.ThirdKey, T2.FirstKey, T2.SecondKey, T2.ThirdKey, T1.AdditionalColumns, T2.AdditionalColumns
HAVING COUNT(*) = 1;
0 голосов
/ 19 октября 2010

предложение.

Сделайте весь свой выбор подзапросом. Давайте назовем это SUBQ

Тогда вы делаете это так:

SELECT *
FROM (SUBQ)
GROUP BY `ThirdKey`
HAVING COUNT(*) = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...