ответ на 1 вопрос:
По теории быстрее второй вариант (тот который у Вас помечен как - "Первый раз я написал так"
потому что:
- SELECT
* FROM
так писать не стоит - Звездочка всегда работает медленне чем перечисление колонок, не намного :) но все же
- просто Left join будет работать быстрее, чем подзапрос - особенно если есть необходимые индексы
ответ на 2 вопрос:
"чтобы возвращалось:[данные первой статьи,[первый комментарий, второй, ...]]"(с)
поддержка такого формата ---> "JSON" реализована в MS SQL 2016
Ну смотри :)
Сам напросился :)
-- Делаем таблички
CREATE TABLE story( id int ,[text] text,author_id int )
CREATE TABLE story_comments( id int,s_id INT,[text] text)
-- Заполнем данными
TRUNCATE TABLE [story]
TRUNCATE TABLE [story_comments]
INSERT INTO [dbo].[story]([id],[text],[author_id])VALUES(1,'Статья 1',1)
INSERT INTO [dbo].[story]([id],[text],[author_id])VALUES(2,'Статья 2',2)
INSERT INTO [dbo].[story_comments]([id],[s_id],[text])VALUES(1,1,'Первый комент Первой статьи')
INSERT INTO [dbo].[story_comments]([id],[s_id],[text])VALUES(2,1,'Второй комент Первой статьи')
INSERT INTO [dbo].[story_comments]([id],[s_id],[text])VALUES(3,1,'Третий комент Первой статьи')
-- Сам запрос
;WITH cte
AS
(
SELECT [text2]=
(
SELECT
--s.id AS 'Story_ID',
s.[text] AS 'Story_Text'
,
(
SELECT ISNULL(
REPLACE(
REPLACE(
REPLACE(
(SELECT [text]=
(SELECT sc.[text]AS 'comment_Text'
FROM [story_comments] sc
WHERE s.id=sc.[s_id]
FOR XML PATH (''))),'</comment_Text><comment_Text>',',')
,'<comment_Text>','['),'</comment_Text>',']')
,'[NULL]')
)
FROM [story] s
FOR XML PATH('')
))
SELECT '['+
REPLACE(
replace (
REPLACE (text2,'<Story_Text>','[')
,'</Story_Text>[',',[')
,'][','],[')+']'
FROM cte
Ответ:
[[Статья 1,[Первый комент Первой статьи,Второй комент Первой статьи,Третий комент Первой статьи],[Статья 2,[NULL]]