Выберите значения для создания уникальной строки с необязательным внешним ключом - PullRequest
0 голосов
/ 06 августа 2020

У меня есть несколько таблиц в базе данных SQL сервера, две из них (Table1 и Table2). Я хотел бы выбрать определенное c подмножество, чтобы заполнить третью таблицу (Table3 ).

В Table1 25 столбцов, из которых меня интересуют только три, назовем их Col1, Col2 и Col3. Все три не уникальны в этой таблице, но я хотел бы извлечь уникальные пары следующим образом:

  • Col1 + Col2 = Уникальный ключ для Table3.
  • Col3 + Col2 = Необязательно , внешний ключ в Table2.

Чтобы извлечь уникальные ключи для Table3 из Table1 следующих SQL отлично работает:

SELECT Col1, Col2 
FROM Table1 
GROUP BY Col1, Col2

Однако это отсутствует Col3. Первая проблема заключается в том, что Col3 нельзя просто добавить как часть GROUP BY, поскольку для него могут быть разные значения, что приводит к возвращению повторяющихся комбинаций Col1 + Col2.

Вот где Table2 вступает в игру; Col3 + Col2 формируют уникальный ключ в Table2, но не каждая комбинация присутствует (что полезно), так как JOIN может использоваться для фильтрации недопустимых комбинаций:

SELECT a.Col1, a.Col2, a.Col3 
FROM Table1 a
JOIN Table2 b ON b.Col3 = a.Col3 AND b.Col2 = a.Col2
GROUP BY a.Col1, a.Col2, a.Col3

Теперь моя последняя проблема, к сожалению, есть несколько (очень мало) комбинаций, которые действительно приводят к дублированию Col1 + Col2 ключей для Table3.

Если мы предполагаем, что можно потерять некоторые Col3 значений, как я могу написать SELECT для извлечения трех столбцов, гарантируя, что комбинация Col1 + Col2 уникальна? И, если возможно, сохраните значение Col3, которое обеспечивает допустимую комбинацию клавиш в Table2.

Я напортачил с добавлением TOP 1, но мне не удалось заставить что-либо работать по своему вкусу. ..

EDIT : Пример данных в соответствии с запросом.

Table1
| Col1 | Col2 | Col3 |
|  100 |   00 |  010 |
|  100 |   10 |  020 |
|  200 |   00 |  030 |
|  300 |   00 |  040 |
|  300 |   00 |  040 |
|  400 |   10 |  050 |
|  400 |   10 |  060 |
|  400 |   10 |  070 |

Table2
| Colx | Col2 | Col3 |
|  car |   00 |  010 |
|  cat |   10 |  030 |
|  dog |   00 |  040 |
|  bee |   10 |  040 |
|  eye |   10 |  060 |
|  bit |   10 |  070 |

Table3
| Col1 | Col2 | Col3 |
|  100 |   00 |  010 |
|  100 |   10 |  020 |
|  200 |   00 |  030 |
|  300 |   00 |  040 |
|  400 |   00 |  060 |

Третья таблица показывает результат, который я ищу - таблица содержит только уникальные комбинации Col1 + Col2, а также содержит Col3 значений, предпочтительно такое, которое обеспечивает комбинацию значений с Col2 во второй таблице (ie. Последняя запись, 400, 00, 060).

Надеюсь, это дает немного больше ясности.

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Может так?

SELECT a.Col1, a.Col2, Max(a.Col3)
FROM Table1 a
LEFT JOIN Table2 b ON b.Col3 = a.Col3 AND b.Col2 = a.Col2
GROUP BY a.Col1, a.Col2
0 голосов
/ 07 августа 2020

«Первая проблема заключается в том, что Col3 нельзя просто добавить как часть GROUP BY, поскольку для него могут быть разные значения, что приводит к возвращению повторяющихся комбинаций Col1 + Col2».

Вы можете поместить запросы для разных значений в подзапрос select union в качестве производной таблицы и сгруппировать по производной таблице.

...