1) Независимо от того, сколько раз фотоблок появляется в вашем наборе результатов, он будет прочитан (с диска в память на сервере) только один раз. Для обеспечения того, чтобы это происходило, есть встроенные оптимизации.
2) Однако его можно переносить (с сервера на клиент) несколько раз, для этого нет встроенной оптимизации.
3) Лучшим решением было бы обернуть это как хранимую процедуру, которая возвращает 2 записиустанавливает, и вы выполняете объединение в коде клинета, этот подход отличается от запуска 2 запросов, для которых требуется два приема в оба конца.
4) если вы не хотите этого делать, вы можете получить все идентификаторы статей изПользователь в формате CSV, а затем вы можете легко разделить CSV на отдельные строки в коде клиента.
Вот пример вывода
UserId UserName UserPhoto CSV_ArticleId CSV_ArticleText
------- --------- ---------- ------------------------ ----------------------------
UserId1 UserName1 UserPhoto1 ",ArticleId1,ArticleId2" ",ArticleText1,ArticleText2"
UserId2 UserName2 UserPhoto2 ",ArticleId3" ",ArticleText3"
Вот как вы можете это сделать.Запустите дословно код в тестовой базе данных, и вы увидите результат
CREATE TABLE Users(UserId int , UserName nvarchar(256), UserPhoto nvarchar(256))
CREATE TABLE Articles (ArticleId int , UserId int , ArticleText nvarchar(256))
INSERT INTO Users(UserId,UserName,UserPhoto)
VALUES (2,'2a','2pa')
INSERT INTO Users(UserId,UserName,UserPhoto)
VALUES (1,'a','pa')
INSERt INTO Articles (ArticleId, UserId, ArticleText)
VALUES (2,2,'text2')
INSERt INTO Articles (ArticleId, UserId, ArticleText)
VALUES (1,2,'text1')
;WITH tArticles AS (SELECT ArticleId, UserId, ArticleText FROM Articles)
SELECT
UserId,
UserName,
UserPhoto,
(SELECT TOP 1 LTRIM(
(SELECT ',' + CONVERT(nvarchar(256),A.ArticleId) FROM Articles A WHERE U.UserId = A.UserId ORDER BY A.ArticleId FOR XML PATH(''))
)) as CSV_ArticleId,
(SELECT TOP 1 LTRIM(
(SELECT ',' + CONVERT(nvarchar(256),A.ArticleText) FROM Articles A WHERE U.UserId = A.UserId ORDER BY A.ArticleId FOR XML PATH(''))
)) as CSV_ArticleText
FROM Users U