#sql #oracle
#sql #Oracle
Вопрос:
У меня есть таблица, в которой есть PrimaryKey, внешний ключ. Я просто хочу найти список одного первичного для каждого внешнего ключа. Пример
Мне нужен запрос, который возвращает только первичные ключи (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 меня сбивает с толку.