В настоящее время мы переносим нашу базу данных из Firebird в PostgreSQL. Мы используем NHibernate в качестве ORM, и переход был довольно безболезненным, хотя в SQL было несколько отличий.
У нас есть один запрос, который мы выполняем, используя NHibernate.CreateSQLQuery, когда сами строим SQL. Запрос возвращает строку List из 5 самых последних использованных имен Ninja для переданных в UserID.
Это не было проблемой в Firebird с использованием следующего SQL;
SELECT FIRST 5 DISTINCT NI.NINJA_NAME
FROM NINJA_ACCESS NA
INNER JOIN NINJAS NI ON NA.NINJA_ID = NI.NINJA_ID
WHERE NA.USER_ID = 1
ORDER BY NI.NINJA_ACCESS_DATE DESC
Возвращение упорядоченного (по убыванию даты доступа) списка строк.
Теперь в PostgreSQL мы сталкиваемся с проблемами с этим простым запросом;
SELECT DISTINCT ON (NI.NINJA_NAME) NI.NINJA_NAME
FROM NINJA_ACCESS NA
INNER JOIN NINJAS NI ON NA.NINJA_ID = NI.NINJA_ID
WHERE NA.USER_ID = 1
ORDER BY NI.NINJA_ACCESS_DATE DESC
LIMIT 5
Похоже, мы не можем вернуть один «отдельный» столбец данных с упорядочением, выполненным для отдельного столбца, который не включен в выборку. Любое изменение в приведенном выше SQL не будет работать, если мы не включим столбец Access_Date в select.
Есть идеи, как мы можем решить этот простой запрос в PostgreSQL?
Примечание: это важный запрос для нашей системы управления ниндзя, настаивает на том, что она работает !!!