Ваш вопрос немного запутан; Вы хотите показать только одну строку для каждого пользователя или хотите показать строку для каждого изображения, но подавить повторяющиеся значения в поле U.NAME? Я думаю, вы хотите второе; если нет, то есть много ответов для первого.
Отображать ли повторяющиеся значения - это логика отображения, для которой SQL не был предназначен. Вы можете использовать курсор в цикле для обработки результатов строка за строкой, но вы потеряете много производительности. Если у вас есть «умный» язык внешнего интерфейса, такой как язык .NET или Java, любой конструкцией, в которую вы помещаете эти данные, можно дешево манипулировать, чтобы подавить повторяющиеся значения, прежде чем окончательно отобразить их в пользовательском интерфейсе.
Если вы используете Microsoft SQL Server и преобразование должно быть выполнено на уровне данных, вы можете рассмотреть возможность использования CTE (выражение вычисляемой таблицы) для хранения начального запроса, а затем выбрать значения из каждой строки CTE в зависимости от того, содержат ли столбцы в предыдущей строке одинаковые данные. Он будет более производительным, чем курсор, но в любом случае будет немного грязно. Обратите внимание:
USING CTE (Row, Name, PicID)
AS
(
SELECT ROW_NUMBER() OVER (ORDER BY U.NAME, P.PIC_ID),
U.NAME, P.PIC_ID
FROM USERS U
INNER JOIN POSTINGS P1
ON U.EMAIL_ID = P1.EMAIL_ID
INNER JOIN PICTURES P
ON P1.PIC_ID = P.PIC_ID
WHERE P.CAPTION LIKE '%car%'
ORDER BY U.NAME, P.PIC_ID
)
SELECT
CASE WHEN current.Name == previous.Name THEN '' ELSE current.Name END,
current.PicID
FROM CTE current
LEFT OUTER JOIN CTE previous
ON current.Row = previous.Row + 1
ORDER BY current.Row
Приведенный выше пример специфичен для TSQL; он не гарантированно работает в любом другом DBPL, таком как PL / SQL, но я думаю, что большинство механизмов SQL уровня предприятия имеют нечто подобное.