La tua domanda è una specie di confusione; vuoi mostrare solo una riga per utente o vuoi mostrare una riga per immagine ma sopprimere i valori ripetuti nel campo U.NAME? Penso che tu voglia il secondo; se non ci sono molte risposte per il primo.
Se visualizzare valori ripetitivi è la logica di visualizzazione, per la quale SQL non è stato progettato. Puoi usare un cursore in un ciclo per elaborare i risultati riga per riga, ma perderai molte prestazioni. Se si dispone di un linguaggio di interfaccia "intelligente" come un linguaggio .NET o Java, qualunque costruzione venga inserita in questi dati può essere manipolata a basso costo per sopprimere i valori ripetuti prima di visualizzarli infine nell'interfaccia utente.
Se si utilizza Microsoft SQL Server e la trasformazione deve essere eseguita sul livello dati, è possibile utilizzare un CTE (espressione della tabella calcolata) per contenere la query iniziale, quindi selezionare i valori da ciascuna riga del CTE in base al fatto che le colonne nella riga precedente mantengano gli stessi dati. Sarà più performante del cursore, ma sarà comunque un po 'disordinato. Osservare:
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
Il campione sopra riportato è specifico per TSQL; non è garantito il funzionamento in nessun altro DBPL come PL/SQL, ma penso che la maggior parte dei motori SQL di livello enterprise abbiano qualcosa di simile.
quale dei multipli P.PIC_ID vuoi con il singolo U.NAME? –