Oracle SQL: как найти только запись из группы

#sql #oracle

#sql #Oracle

Вопрос:

У меня есть таблица, в которой есть PrimaryKey, внешний ключ. Я просто хочу найти список одного первичного для каждого внешнего ключа. Пример MYTABLE

Мне нужен запрос, который возвращает только первичные ключи (1 или 2 или 3) и (4 или 5) или (6 или 7 или 8), по сути, 1,4 и 6. Как я могу получить только один PK для каждого внешнего ключа

Ответ №1:

Используйте агрегацию:

 select foreignKey, min(primaryKey)
from t
group by foreignKey;
  

Если вам нужно случайное значение, вы можете использовать keep синтаксис:

 select foreignKey,
       min(primaryKey) keep (dense_rank first order by dbms_random.random)
from t
group by foreignKey;
  

И если у вас было много столбцов, вы могли бы использовать row_number() или коррелированный подзапрос:

 select t.*
from t
where t.primarykey = (select min(t2.primarykey) from t t2 where t2.foreignkey = t.foreignkey);
  

Комментарии:

1. У меня есть следующий вопрос. У меня есть другая таблица, в которой есть список всех вышеперечисленных первичных ключей. Допустим, таблица B. Как я могу проверить, какой из min (первичный ключ), исходящий из приведенного выше запроса, не существует в таблице B?

2. @Marco . , , Просто используйте not exists в where предложении. Если это непонятно, задайте новый вопрос с соответствующим объяснением.

3. Похоже, я не могу опубликовать еще один вопрос в течение 90 минут. Я понимаю, что НЕ СУЩЕСТВУЕТ и ГДЕ, но группа by меня сбивает с толку.