Ваш вопрос сбивает с толку; вы хотите отображать только одну строку для каждого пользователя или вы хотите отображать строку для каждого изображения, но подавлять повторяющиеся значения в поле 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-движков корпоративного уровня есть нечто подобное.
person
KeithS
schedule
03.02.2011