Хотя стандарт C ++ не имеет такого требования, некоторым компиляторам требуется, чтобы все шаблоны функций и классов были доступны в каждой используемой системе переводов. Фактически для этих компиляторов тела шаблонных функций должны быть доступны в файле заголовка. Повторить: это означает, что эти компиляторы не позволят их определять в файлах без заголовка, таких как .cpp-файлы
Существует ключевое слово export , которое должно смягчать этот проблема, но он нигде не близок к тому, чтобы быть портативным.
Эрик Петрелье почти прав:
SELECT * FROM TableA
WHERE ROWID IN ( SELECT MAX(ROWID) FROM TableA GROUP BY Language )
Примечание: использование ROWID (уникальный идентификатор строки), а не ROWNUM (который дает номер строки в наборе результатов)
Ради эффективности вы хотите использовать данные только один раз, как это делает Харпер. Однако вы не хотите использовать rank (), потому что он даст вам связи, и в дальнейшем вы хотите группировать по языку, а не по языку. Оттуда вы хотите добавить предложение order by, чтобы различать строки, но вы не хотите фактически сортировать данные. Для этого я бы использовал "порядок по нулю" Например
count (*) over (группировать по языковому порядку по нулю)
Я бы использовал функцию RANK () в подвыборке а затем просто вытащите строку, где rank = 1.
select person, language
from
(
select person, language, rank() over(order by language) as rank
from table A
group by person, language
)
where rank = 1
Мой Oracle немного устарел, но я думаю, что это сработает:
SELECT * FROM TableA
WHERE ROWID IN ( SELECT MAX(ROWID) FROM TableA GROUP BY Language )
Это будет более эффективно, к тому же вы сможете контролировать порядок выбора значение:
SELECT DISTINCT
FIRST_VALUE(person)
OVER(PARTITION BY language
ORDER BY person)
,language
FROM tableA;
Если вы действительно не Неважно, какой человек выбран для каждого языка, вы можете опустить предложение ORDER BY:
SELECT DISTINCT
FIRST_VALUE(person)
OVER(PARTITION BY language)
,language
FROM tableA;