SQL Server 2012.внутреннее соединение между столом и подзапрос на том же столе
Edit: мой первоначальный запрос был более сложным, чем это должно быть, так как я пытался сделать Distinct запрос на подмножества полей в таблице и присоедините это к самой таблице, чтобы получить другие (текстовые) поля. следующий запрос делает трюк, а также:
SELECT DISTINCT
p1.id
,p1.Name
,CAST(p1.[Description] AS nvarchar(max)) AS Description
,(SELECT [Category] + ', '
FROM [dbo].[Company] AS p2
WHERE p2.Id = p1.Id
ORDER BY Name
FOR XML PATH('')) AS Categories
FROM [dbo].[Company] AS p1
ORDER BY p1.Id
У меня есть таблица с данными, похожими на это (несколько записей в компании, которые идентичны для поля категории, за исключением):
+----+------+-----------------+----------+
| Id | Name | Description | Category |
+----+------+-----------------+----------+
| 1 | AAA | <loads of text> | cat1 |
| 1 | AAA | <loads of text> | cat2 |
| 2 | BBB | <even more text>| cat1 |
| 2 | BBB | <even more text>| cat3 |
+----+------+-----------------+----------+
Я пытаясь сделать запрос, чтобы получить этот результат (уникальных записей в компании и категории агрегированные в 1 поле):
| 1 | AAA | <loads of text> | cat1, cat2 |
| 2 | BBB | <even more text>| cat1, cat3 |
Используя информацию из различных тем на SO я придумал это:
SELECT
t1.Id
,t2.Name
,t2.[Description]
,t1.Category
FROM [dbo].[Company] AS t2
INNER JOIN (SELECT DISTINCT p1.Id
,(SELECT [Category] + ', '
FROM [dbo].[Company] AS p2
WHERE p2.Id = p1.Id
ORDER BY Name
FOR XML PATH('')) AS Category
FROM [dbo].[Company] AS p1
) AS t1 ON t1.Id = t2.Id
ORDER BY t1.Id
Результат запроса содержит запись для каждой записи в таблице компании, с категориями агрегируются в поле категории:
+----+------+-----------------+------------+
| Id | Name | Description | Category |
+----+------+-----------------+------------+
| 1 | AAA | <loads of text> | cat1, cat2 |
| 1 | AAA | <loads of text> | cat1, cat2 |
| 2 | BBB | <even more text>| cat1, cat3 |
| 2 | BBB | <even more text>| cat1, cat3 |
+----+------+-----------------+------------+
Я думал INNER JOIN будет выбирать только строки, если обе таблицы имеют совпадение. Подзапрос создает сам по себе ожидаемый результат (по одной записи на идентификатор с агрегированными категориями). Я попробовал другое предложение group by по всему запросу, но это терпит неудачу, потому что я не могу включить поле Description в предложение group, так как это поле типа текста.
Что мне не хватает?
Используйте отличимым, если описание такой же и отказаться от описания или агрегировать описание также –
мне нужно описание в результате запроса, и я не могу агрегировать его, я хотел бы получить 10 раз тот же текст в поле описания. –
Просто добавьте GROUP BY Id, Name, Description. –