вы должны использовать другое соединение, что-то в этом направлении:
SELECT toD.dom_url AS ToURL,
fromD.dom_url AS FromUrl,
rvw.*
FROM reviews AS rvw
LEFT JOIN domain AS toD
ON toD.Dom_ID = rvw.rev_dom_for
LEFT JOIN domain AS fromD
ON fromD.Dom_ID = rvw.rev_dom_from
EDIT :
Все, что вы делаете, это соединение в таблицу несколько раз. Посмотрите на запрос в сообщении: он выбирает значения из таблиц отзывов (aliased as rvw), эта таблица предоставляет вам 2 ссылки на таблицу домена (FOR и FROM).
На этом этапе просто оставить слева таблицу Домен в таблице отзывов. Один раз (с псевдонимом toD) для FOR и второй раз (с псевдонимом fromD) для FROM.
Затем в списке SELECT вы выберете поля DOM_URL из обоих LEFT JOINS таблицы DOMAIN , ссылаясь на них псевдонимом таблицы для каждого, связанного с ссылкой на таблицу Domains, и псевдоним их как ToURL и FromUrl.
. Для получения дополнительной информации об aliasing в SQL читайте здесь здесь .
Как я вижу, это проблема конкатенации строк. Я использовал замену для управления персонажем & amp; в XML.
select a.col1, Col3=replace(stuff((SELECT '#' + b.col3 AS 'data()'
FROM OutputBefore) b
where b.Col1=a.Col1
FOR XML PATH('')),1,1,''),'#','&')
from (select distinct Col1 from OutputBefore) a;
Как уже упоминали forpas и Russell, начиная с SQL 2017 вы можете использовать функцию STRING_AGG.
Для SQL 2008+ Обратитесь к этому:
Как работают вещи и «Для пути XML» в Sql Server
В вашем случае вы хотите, чтобы разделитель был быть "& amp;" что вызовет проблему с FOR XML PATH из-за специального символа XML. Итак, вы захотите экранировать специальные символы XML, например:
DECLARE @TableA TABLE (Col1 NVARCHAR(10), Col2 INT, Col3 NVARCHAR(10), Col4
NVARCHAR(10), Col5 INT)
INSERT INTO @TableA (Col1, Col2, Col3, Col4, Col5)
VALUES ('Dave' , 24 , 'house' , 'married' , 2)
, ('Dave' , 24 , 'car' , 'married' , 2)
, ('Bob' , 32 , 'House' , 'single' , 1)
, ('George' , 12 , 'house' , 'divorced' , 1)
SELECT
t2.Col1
, t2.Col2
, STUFF ( ( SELECT '&' + Col3 -- Adding '&' as delimited
FROM @TableA t1
WHERE t1.Col2 = t2.Col2
FOR XML PATH (''), TYPE
).value('.', 'VARCHAR(MAX)'),1,1,''-- To escape special characters
) AS Col3
, t2.Col4
FROM @TableA AS t2
GROUP BY t2.Col1
, t2.Col2
, t2.Col4
Поскольку вы используете SQL Server 2017, вы можете получить то, что хотите, с помощью STRING_AGG
:
select column1, column2, string_agg(column3, '&') as column3, column4
from outputbefore
group by column1, column2, column4
Вы хотите объединить несколько строк в одно значение. Ваши параметры зависят от вашей версии SQL Server. В более старых версиях (я думаю 2005+) вы должны использовать извилистую процедуру XML. Запустите это на своем сервере, и вы увидите, как это работает, но я оставлю вам решать запрос ваших данных:
SELECT STUFF(
(SELECT ', <' + name + '>'
FROM sys.databases
WHERE database_id > 4
ORDER BY name
FOR XML PATH('') ,
ROOT('MyString') ,
TYPE
).value('/MyString[1]', 'varchar(max)'), 1, 2, '') AS namelist;
Начиная с SQL 2017 вы можете использовать функцию STRING_AGG , объяснил здесь .