У меня есть несколько таблиц в базе данных 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).
Надеюсь, это дает немного больше ясности.